History

riscv: Handle more relocs

those happen on SUSE systems.

Michael Matz committed 7 years ago

Commit 5fcb8711 parent 93095851 file · +30 −0Browse files

Unified · Split

riscv64-link.c+30−0
@@ -37,8 +37,14 @@ int code_reloc (int reloc_type) · 36 unmodified lines
37 case R_RISCV_PCREL_LO12_I:37 case R_RISCV_PCREL_LO12_I:
38 case R_RISCV_PCREL_LO12_S:38 case R_RISCV_PCREL_LO12_S:
39 case R_RISCV_32_PCREL:39 case R_RISCV_32_PCREL:
40 case R_RISCV_SET6:
41 case R_RISCV_SUB6:
42 case R_RISCV_ADD16:
40 case R_RISCV_ADD32:43 case R_RISCV_ADD32:
44 case R_RISCV_ADD64:
45 case R_RISCV_SUB16:
41 case R_RISCV_SUB32:46 case R_RISCV_SUB32:
47 case R_RISCV_SUB64:
42 case R_RISCV_32:48 case R_RISCV_32:
43 case R_RISCV_64:49 case R_RISCV_64:
44 return 0;50 return 0;
@@ -61,6 +67,10 @@ int gotplt_entry_type (int reloc_type) · 16 unmodified lines
61 case R_RISCV_RVC_BRANCH:67 case R_RISCV_RVC_BRANCH:
62 case R_RISCV_RVC_JUMP:68 case R_RISCV_RVC_JUMP:
63 case R_RISCV_JUMP_SLOT:69 case R_RISCV_JUMP_SLOT:
70 case R_RISCV_SET6:
71 case R_RISCV_SUB6:
72 case R_RISCV_ADD16:
73 case R_RISCV_SUB16:
64 return NO_GOTPLT_ENTRY;74 return NO_GOTPLT_ENTRY;
65 75
66 case R_RISCV_BRANCH:76 case R_RISCV_BRANCH:
@@ -70,7 +80,9 @@ int gotplt_entry_type (int reloc_type) · 3 unmodified lines
70 case R_RISCV_PCREL_LO12_S:80 case R_RISCV_PCREL_LO12_S:
71 case R_RISCV_32_PCREL:81 case R_RISCV_32_PCREL:
72 case R_RISCV_ADD32:82 case R_RISCV_ADD32:
83 case R_RISCV_ADD64:
73 case R_RISCV_SUB32:84 case R_RISCV_SUB32:
85 case R_RISCV_SUB64:
74 case R_RISCV_32:86 case R_RISCV_32:
75 case R_RISCV_64:87 case R_RISCV_64:
76 case R_RISCV_JAL:88 case R_RISCV_JAL:
@@ -287,12 +299,30 @@ void relocate(TCCState *s1, ElfW_Rel *rel, int type, unsigned char *ptr, · 210 unmodified lines
287 case R_RISCV_64:299 case R_RISCV_64:
288 write64le(ptr, val);300 write64le(ptr, val);
289 return;301 return;
302 case R_RISCV_ADD64:
303 write64le(ptr, read64le(ptr) + val);
304 return;
290 case R_RISCV_ADD32:305 case R_RISCV_ADD32:
291 write32le(ptr, read32le(ptr) + val);306 write32le(ptr, read32le(ptr) + val);
292 return;307 return;
308 case R_RISCV_SUB64:
309 write64le(ptr, read64le(ptr) - val);
310 return;
293 case R_RISCV_SUB32:311 case R_RISCV_SUB32:
294 write32le(ptr, read32le(ptr) - val);312 write32le(ptr, read32le(ptr) - val);
295 return;313 return;
314 case R_RISCV_ADD16:
315 write16le(ptr, read16le(ptr) + val);
316 return;
317 case R_RISCV_SUB16:
318 write16le(ptr, read16le(ptr) - val);
319 return;
320 case R_RISCV_SET6:
321 *ptr = (*ptr & ~0x3f) | (val & 0x3f);
322 return;
323 case R_RISCV_SUB6:
324 *ptr = (*ptr & ~0x3f) | ((*ptr - val) & 0x3f);
325 return;
296 326
297 case R_RISCV_32_PCREL:327 case R_RISCV_32_PCREL:
298 case R_RISCV_COPY:328 case R_RISCV_COPY: