Lines Matching full:off

86 static void applySecRel(const SectionChunk *sec, uint8_t *off,
95 add32(off, secRel);
98 static void applySecIdx(uint8_t *off, OutputSection *os,
108 add16(off, os->sectionIndex);
110 add16(off, numOutputSections + 1);
113 void SectionChunk::applyRelX64(uint8_t *off, uint16_t type, OutputSection *os,
118 add32(off, s + imageBase);
121 add64(off, s + imageBase);
123 case IMAGE_REL_AMD64_ADDR32NB: add32(off, s); break;
124 case IMAGE_REL_AMD64_REL32: add32(off, s - p - 4); break;
125 case IMAGE_REL_AMD64_REL32_1: add32(off, s - p - 5); break;
126 case IMAGE_REL_AMD64_REL32_2: add32(off, s - p - 6); break;
127 case IMAGE_REL_AMD64_REL32_3: add32(off, s - p - 7); break;
128 case IMAGE_REL_AMD64_REL32_4: add32(off, s - p - 8); break;
129 case IMAGE_REL_AMD64_REL32_5: add32(off, s - p - 9); break;
131 applySecIdx(off, os, file->ctx.outputSections.size());
133 case IMAGE_REL_AMD64_SECREL: applySecRel(this, off, os, s); break;
140 void SectionChunk::applyRelX86(uint8_t *off, uint16_t type, OutputSection *os,
146 add32(off, s + imageBase);
148 case IMAGE_REL_I386_DIR32NB: add32(off, s); break;
149 case IMAGE_REL_I386_REL32: add32(off, s - p - 4); break;
151 applySecIdx(off, os, file->ctx.outputSections.size());
153 case IMAGE_REL_I386_SECREL: applySecRel(this, off, os, s); break;
160 static void applyMOV(uint8_t *off, uint16_t v) {
161 write16le(off, (read16le(off) & 0xfbf0) | ((v & 0x800) >> 1) | ((v >> 12) & 0xf));
162 write16le(off + 2, (read16le(off + 2) & 0x8f00) | ((v & 0x700) << 4) | (v & 0xff));
165 static uint16_t readMOV(uint8_t *off, bool movt) {
166 uint16_t op1 = read16le(off);
170 uint16_t op2 = read16le(off + 2);
178 void applyMOV32T(uint8_t *off, uint32_t v) {
179 uint16_t immW = readMOV(off, false); // read MOVW operand
180 uint16_t immT = readMOV(off + 4, true); // read MOVT operand
183 applyMOV(off, v); // set MOVW operand
184 applyMOV(off + 4, v >> 16); // set MOVT operand
187 static void applyBranch20T(uint8_t *off, int32_t v) {
193 or16(off, (s << 10) | ((v >> 12) & 0x3f));
194 or16(off + 2, (j1 << 13) | (j2 << 11) | ((v >> 1) & 0x7ff));
197 void applyBranch24T(uint8_t *off, int32_t v) {
203 or16(off, (s << 10) | ((v >> 12) & 0x3ff));
205 write16le(off + 2, (read16le(off + 2) & 0xd000) | (j1 << 13) | (j2 << 11) | ((v >> 1) & 0x7ff));
208 void SectionChunk::applyRelARM(uint8_t *off, uint16_t type, OutputSection *os,
217 add32(off, sx + imageBase);
219 case IMAGE_REL_ARM_ADDR32NB: add32(off, sx); break;
221 applyMOV32T(off, sx + imageBase);
223 case IMAGE_REL_ARM_BRANCH20T: applyBranch20T(off, sx - p - 4); break;
224 case IMAGE_REL_ARM_BRANCH24T: applyBranch24T(off, sx - p - 4); break;
225 case IMAGE_REL_ARM_BLX23T: applyBranch24T(off, sx - p - 4); break;
227 applySecIdx(off, os, file->ctx.outputSections.size());
229 case IMAGE_REL_ARM_SECREL: applySecRel(this, off, os, s); break;
230 case IMAGE_REL_ARM_REL32: add32(off, sx - p - 4); break;
240 void applyArm64Addr(uint8_t *off, uint64_t s, uint64_t p, int shift) {
241 uint32_t orig = read32le(off);
249 write32le(off, (orig & ~mask) | immLo | immHi);
255 void applyArm64Imm(uint8_t *off, uint64_t imm, uint32_t rangeLimit) {
256 uint32_t orig = read32le(off);
259 write32le(off, orig | ((imm & (0xFFF >> rangeLimit)) << 10));
270 static void applyArm64Ldr(uint8_t *off, uint64_t imm) {
271 uint32_t orig = read32le(off);
279 applyArm64Imm(off, imm >> size, size);
282 static void applySecRelLow12A(const SectionChunk *sec, uint8_t *off,
285 applyArm64Imm(off, (s - os->getRVA()) & 0xfff, 0);
288 static void applySecRelHigh12A(const SectionChunk *sec, uint8_t *off,
298 applyArm64Imm(off, secRel & 0xfff, 0);
301 static void applySecRelLdr(const SectionChunk *sec, uint8_t *off,
304 applyArm64Ldr(off, (s - os->getRVA()) & 0xfff);
307 void applyArm64Branch26(uint8_t *off, int64_t v) {
310 or32(off, (v & 0x0FFFFFFC) >> 2);
313 static void applyArm64Branch19(uint8_t *off, int64_t v) {
316 or32(off, (v & 0x001FFFFC) << 3);
319 static void applyArm64Branch14(uint8_t *off, int64_t v) {
322 or32(off, (v & 0x0000FFFC) << 3);
325 void SectionChunk::applyRelARM64(uint8_t *off, uint16_t type, OutputSection *os,
329 case IMAGE_REL_ARM64_PAGEBASE_REL21: applyArm64Addr(off, s, p, 12); break;
330 case IMAGE_REL_ARM64_REL21: applyArm64Addr(off, s, p, 0); break;
331 case IMAGE_REL_ARM64_PAGEOFFSET_12A: applyArm64Imm(off, s & 0xfff, 0); break;
332 case IMAGE_REL_ARM64_PAGEOFFSET_12L: applyArm64Ldr(off, s & 0xfff); break;
333 case IMAGE_REL_ARM64_BRANCH26: applyArm64Branch26(off, s - p); break;
334 case IMAGE_REL_ARM64_BRANCH19: applyArm64Branch19(off, s - p); break;
335 case IMAGE_REL_ARM64_BRANCH14: applyArm64Branch14(off, s - p); break;
337 add32(off, s + imageBase);
339 case IMAGE_REL_ARM64_ADDR32NB: add32(off, s); break;
341 add64(off, s + imageBase);
343 case IMAGE_REL_ARM64_SECREL: applySecRel(this, off, os, s); break;
344 case IMAGE_REL_ARM64_SECREL_LOW12A: applySecRelLow12A(this, off, os, s); break;
345 case IMAGE_REL_ARM64_SECREL_HIGH12A: applySecRelHigh12A(this, off, os, s); break;
346 case IMAGE_REL_ARM64_SECREL_LOW12L: applySecRelLdr(this, off, os, s); break;
348 applySecIdx(off, os, file->ctx.outputSections.size());
350 case IMAGE_REL_ARM64_REL32: add32(off, s - p - 4); break;
421 void SectionChunk::applyRelocation(uint8_t *off,
448 applyRelX64(off, rel.Type, os, s, p, imageBase);
451 applyRelX86(off, rel.Type, os, s, p, imageBase);
454 applyRelARM(off, rel.Type, os, s, p, imageBase);
457 applyRelARM64(off, rel.Type, os, s, p, imageBase);
811 int64_t off = impSymbol->getRVA() & 0xfff;
814 applyArm64Ldr(buf + 4, off);
1048 size_t off = builder.getOffset(toStringRef(c->getContents()));
1049 c->setRVA(rva + off);