- remove debug printf and commented out code - remove C++-like comments - remove whitespace at end of lines - replace tabs by spaces
Unified · Split
| @@ -1,6 +1,6 @@ | ||
| 1 | 1 | /* |
| 2 | 2 | * ELF file handling for TCC |
| 3 | − * | |
| 3 | + * | |
| 4 | 4 | * Copyright (c) 2001-2004 Fabrice Bellard |
| 5 | 5 | * |
| 6 | 6 | * This library is free software; you can redistribute it and/or |
| @@ -38,7 +38,7 @@ ST_FUNC int put_elf_str(Section *s, const char *sym) · 31 unmodified lines | ||
| 38 | 38 | static unsigned long elf_hash(const unsigned char *name) |
| 39 | 39 | { |
| 40 | 40 | unsigned long h = 0, g; |
| 41 | − | |
| 41 | + | |
| 42 | 42 | while (*name) { |
| 43 | 43 | h = (h << 4) + *name++; |
| 44 | 44 | g = h & 0xf0000000; |
| @@ -91,7 +91,7 @@ ST_FUNC int put_elf_sym(Section *s, addr_t value, unsigned long size, · 46 unmodified lines | ||
| 91 | 91 | int nbuckets, h; |
| 92 | 92 | ElfW(Sym) *sym; |
| 93 | 93 | Section *hs; |
| 94 | − | |
| 94 | + | |
| 95 | 95 | sym = section_ptr_add(s, sizeof(ElfW(Sym))); |
| 96 | 96 | if (name) |
| 97 | 97 | name_offset = put_elf_str(s->link, name); |
| @@ -139,7 +139,7 @@ ST_FUNC int find_elf_sym(Section *s, const char *name) · 41 unmodified lines | ||
| 139 | 139 | Section *hs; |
| 140 | 140 | int nbuckets, sym_index, h; |
| 141 | 141 | const char *name1; |
| 142 | − | |
| 142 | + | |
| 143 | 143 | hs = s->hash; |
| 144 | 144 | if (!hs) |
| 145 | 145 | return 0; |
| @@ -198,7 +198,7 @@ ST_FUNC int add_elf_sym(Section *s, addr_t value, unsigned long size, · 52 unmodified lines | ||
| 198 | 198 | sym_bind = ELFW(ST_BIND)(info); |
| 199 | 199 | sym_type = ELFW(ST_TYPE)(info); |
| 200 | 200 | sym_vis = ELFW(ST_VISIBILITY)(other); |
| 201 | − | |
| 201 | + | |
| 202 | 202 | if (sym_bind != STB_LOCAL) { |
| 203 | 203 | /* we search global or weak symbols */ |
| 204 | 204 | sym_index = find_elf_sym(s, name); |
| @@ -257,8 +257,8 @@ ST_FUNC int add_elf_sym(Section *s, addr_t value, unsigned long size, · 52 unmodified lines | ||
| 257 | 257 | } |
| 258 | 258 | } else { |
| 259 | 259 | do_def: |
| 260 | − sym_index = put_elf_sym(s, value, size, | |
| 261 | − ELFW(ST_INFO)(sym_bind, sym_type), other, | |
| 260 | + sym_index = put_elf_sym(s, value, size, | |
| 261 | + ELFW(ST_INFO)(sym_bind, sym_type), other, | |
| 262 | 262 | sh_num, name); |
| 263 | 263 | } |
| 264 | 264 | return sym_index; |
| @@ -311,11 +311,11 @@ ST_FUNC void put_stabs(const char *str, int type, int other, int desc, · 46 unmodified lines | ||
| 311 | 311 | sym->n_value = value; |
| 312 | 312 | } |
| 313 | 313 | |
| 314 | −ST_FUNC void put_stabs_r(const char *str, int type, int other, int desc, | |
| 314 | +ST_FUNC void put_stabs_r(const char *str, int type, int other, int desc, | |
| 315 | 315 | unsigned long value, Section *sec, int sym_index) |
| 316 | 316 | { |
| 317 | 317 | put_stabs(str, type, other, desc, value); |
| 318 | − put_elf_reloc(symtab_section, stab_section, | |
| 318 | + put_elf_reloc(symtab_section, stab_section, | |
| 319 | 319 | stab_section->data_offset - sizeof(unsigned int), |
| 320 | 320 | R_DATA_32, sym_index); |
| 321 | 321 | } |
| @@ -370,7 +370,7 @@ static void sort_syms(TCCState *s1, Section *s) · 48 unmodified lines | ||
| 370 | 370 | } |
| 371 | 371 | p++; |
| 372 | 372 | } |
| 373 | − | |
| 373 | + | |
| 374 | 374 | /* we copy the new symbols to the old */ |
| 375 | 375 | memcpy(s->data, new_syms, nb_syms * sizeof(ElfW(Sym))); |
| 376 | 376 | tcc_free(new_syms); |
| @@ -390,7 +390,7 @@ static void sort_syms(TCCState *s1, Section *s) · 13 unmodified lines | ||
| 390 | 390 | } |
| 391 | 391 | } |
| 392 | 392 | } |
| 393 | − | |
| 393 | + | |
| 394 | 394 | tcc_free(old_to_new_syms); |
| 395 | 395 | } |
| 396 | 396 | |
| @@ -588,13 +588,13 @@ ST_FUNC void relocate_section(TCCState *s1, Section *s) · 191 unmodified lines | ||
| 588 | 588 | case R_386_16: |
| 589 | 589 | if (s1->output_format != TCC_OUTPUT_FORMAT_BINARY) { |
| 590 | 590 | output_file: |
| 591 | − tcc_error("can only produce 16-bit binary files"); | |
| 591 | + tcc_error("can only produce 16-bit binary files"); | |
| 592 | 592 | } |
| 593 | 593 | *(short *)ptr += val; |
| 594 | 594 | break; |
| 595 | 595 | case R_386_PC16: |
| 596 | 596 | if (s1->output_format != TCC_OUTPUT_FORMAT_BINARY) |
| 597 | − goto output_file; | |
| 597 | + goto output_file; | |
| 598 | 598 | *(short *)ptr += val - addr; |
| 599 | 599 | break; |
| 600 | 600 | #elif defined(TCC_TARGET_ARM) |
| @@ -642,7 +642,7 @@ ST_FUNC void relocate_section(TCCState *s1, Section *s) · 41 unmodified lines | ||
| 642 | 642 | guard its use */ |
| 643 | 643 | case R_ARM_THM_PC22: |
| 644 | 644 | case R_ARM_THM_JUMP24: |
| 645 | − { | |
| 645 | + { | |
| 646 | 646 | int x, hi, lo, s, j1, j2, i1, i2, imm10, imm11; |
| 647 | 647 | int to_thumb, is_call, to_plt, blx_bit = 1 << 12; |
| 648 | 648 | Section *plt; |
| @@ -720,7 +720,7 @@ ST_FUNC void relocate_section(TCCState *s1, Section *s) · 71 unmodified lines | ||
| 720 | 720 | *(int *)ptr |= x; |
| 721 | 721 | else |
| 722 | 722 | *(int *)ptr += x; |
| 723 | − } | |
| 723 | + } | |
| 724 | 724 | break; |
| 725 | 725 | case R_ARM_THM_MOVT_ABS: |
| 726 | 726 | case R_ARM_THM_MOVW_ABS_NC: |
| @@ -737,7 +737,7 @@ ST_FUNC void relocate_section(TCCState *s1, Section *s) · 10 unmodified lines | ||
| 737 | 737 | *(int *)ptr |= x; |
| 738 | 738 | else |
| 739 | 739 | *(int *)ptr += x; |
| 740 | − } | |
| 740 | + } | |
| 741 | 741 | break; |
| 742 | 742 | case R_ARM_PREL31: |
| 743 | 743 | { |
| @@ -784,15 +784,15 @@ ST_FUNC void relocate_section(TCCState *s1, Section *s) · 40 unmodified lines | ||
| 784 | 784 | case R_C60LO16: |
| 785 | 785 | { |
| 786 | 786 | uint32_t orig; |
| 787 | − | |
| 788 | − /* put the low 16 bits of the absolute address */ | |
| 789 | − // add to what is already there | |
| 790 | − | |
| 787 | + | |
| 788 | + /* put the low 16 bits of the absolute address | |
| 789 | + add to what is already there */ | |
| 790 | + | |
| 791 | 791 | orig = ((*(int *)(ptr )) >> 7) & 0xffff; |
| 792 | 792 | orig |= (((*(int *)(ptr+4)) >> 7) & 0xffff) << 16; |
| 793 | − | |
| 794 | − //patch both at once - assumes always in pairs Low - High | |
| 795 | − | |
| 793 | + | |
| 794 | + /* patch both at once - assumes always in pairs Low - High */ | |
| 795 | + | |
| 796 | 796 | *(int *) ptr = (*(int *) ptr & (~(0xffff << 7)) ) | (((val+orig) & 0xffff) << 7); |
| 797 | 797 | *(int *)(ptr+4) = (*(int *)(ptr+4) & (~(0xffff << 7)) ) | ((((val+orig)>>16) & 0xffff) << 7); |
| 798 | 798 | } |
| @@ -990,7 +990,7 @@ static void build_got(TCCState *s1) · 191 unmodified lines | ||
| 990 | 990 | /* if no got, then create it */ |
| 991 | 991 | s1->got = new_section(s1, ".got", SHT_PROGBITS, SHF_ALLOC | SHF_WRITE); |
| 992 | 992 | s1->got->sh_entsize = 4; |
| 993 | − add_elf_sym(symtab_section, 0, 4, ELFW(ST_INFO)(STB_GLOBAL, STT_OBJECT), | |
| 993 | + add_elf_sym(symtab_section, 0, 4, ELFW(ST_INFO)(STB_GLOBAL, STT_OBJECT), | |
| 994 | 994 | 0, s1->got->sh_num, "_GLOBAL_OFFSET_TABLE_"); |
| 995 | 995 | ptr = section_ptr_add(s1->got, 3 * PTR_SIZE); |
| 996 | 996 | #if PTR_SIZE == 4 |
| @@ -1014,7 +1014,7 @@ static void build_got(TCCState *s1) · 17 unmodified lines | ||
| 1014 | 1014 | /* put a got entry corresponding to a symbol in symtab_section. 'size' |
| 1015 | 1015 | and 'info' can be modifed if more precise info comes from the DLL */ |
| 1016 | 1016 | static void put_got_entry(TCCState *s1, |
| 1017 | − int reloc_type, unsigned long size, int info, | |
| 1017 | + int reloc_type, unsigned long size, int info, | |
| 1018 | 1018 | int sym_index) |
| 1019 | 1019 | { |
| 1020 | 1020 | int index; |
| @@ -1092,7 +1092,7 @@ static void put_got_entry(TCCState *s1, · 71 unmodified lines | ||
| 1092 | 1092 | if (reloc_type == R_ARM_JUMP_SLOT) { |
| 1093 | 1093 | Section *plt; |
| 1094 | 1094 | uint8_t *p; |
| 1095 | − | |
| 1095 | + | |
| 1096 | 1096 | /* if we build a DLL, we add a %ebx offset */ |
| 1097 | 1097 | if (s1->output_type == TCC_OUTPUT_DLL) |
| 1098 | 1098 | tcc_error("DLLs unimplemented!"); |
| @@ -1110,14 +1110,14 @@ static void put_got_entry(TCCState *s1, · 11 unmodified lines | ||
| 1110 | 1110 | |
| 1111 | 1111 | if (s1->sym_attrs[sym_index].plt_thumb_stub) { |
| 1112 | 1112 | p = section_ptr_add(plt, 20); |
| 1113 | − put32(p , 0x4778); // bx pc | |
| 1114 | − put32(p+2, 0x46c0); // nop | |
| 1113 | + put32(p , 0x4778); /* bx pc */ | |
| 1114 | + put32(p+2, 0x46c0); /* nop */ | |
| 1115 | 1115 | p += 4; |
| 1116 | 1116 | } else |
| 1117 | 1117 | p = section_ptr_add(plt, 16); |
| 1118 | − put32(p , 0xe59fc004); // ldr ip, [pc, #4] // offset in GOT | |
| 1119 | − put32(p+4, 0xe08fc00c); // add ip, pc, ip // absolute address or offset | |
| 1120 | − put32(p+8, 0xe59cf000); // ldr pc, [ip] // load absolute address or load offset | |
| 1118 | + put32(p , 0xe59fc004); /* ldr ip, [pc, #4] ; offset in GOT */ | |
| 1119 | + put32(p+4, 0xe08fc00c); /* add ip, pc, ip ; absolute address or offset */ | |
| 1120 | + put32(p+8, 0xe59cf000); /* ldr pc, [ip] ; load absolute address or load offset */ | |
| 1121 | 1121 | put32(p+12, s1->got->data_offset); |
| 1122 | 1122 | |
| 1123 | 1123 | /* the symbol is modified so that it will be relocated to |
| @@ -1130,11 +1130,11 @@ static void put_got_entry(TCCState *s1, · 6 unmodified lines | ||
| 1130 | 1130 | #else |
| 1131 | 1131 | #error unsupported CPU |
| 1132 | 1132 | #endif |
| 1133 | − index = put_elf_sym(s1->dynsym, offset, | |
| 1133 | + index = put_elf_sym(s1->dynsym, offset, | |
| 1134 | 1134 | size, info, 0, sym->st_shndx, name); |
| 1135 | 1135 | /* put a got entry */ |
| 1136 | − put_elf_reloc(s1->dynsym, s1->got, | |
| 1137 | − s1->got->data_offset, | |
| 1136 | + put_elf_reloc(s1->dynsym, s1->got, | |
| 1137 | + s1->got->data_offset, | |
| 1138 | 1138 | reloc_type, index); |
| 1139 | 1139 | } |
| 1140 | 1140 | ptr = section_ptr_add(s1->got, PTR_SIZE); |
| @@ -1177,7 +1177,7 @@ ST_FUNC void build_got_entries(TCCState *s1) · 36 unmodified lines | ||
| 1177 | 1177 | reloc_type = R_386_GLOB_DAT; |
| 1178 | 1178 | else |
| 1179 | 1179 | reloc_type = R_386_JMP_SLOT; |
| 1180 | − put_got_entry(s1, reloc_type, sym->st_size, sym->st_info, | |
| 1180 | + put_got_entry(s1, reloc_type, sym->st_size, sym->st_info, | |
| 1181 | 1181 | sym_index); |
| 1182 | 1182 | } |
| 1183 | 1183 | break; |
| @@ -1196,7 +1196,7 @@ ST_FUNC void build_got_entries(TCCState *s1) · 12 unmodified lines | ||
| 1196 | 1196 | reloc_type = R_ARM_GLOB_DAT; |
| 1197 | 1197 | else |
| 1198 | 1198 | reloc_type = R_ARM_JUMP_SLOT; |
| 1199 | − put_got_entry(s1, reloc_type, sym->st_size, sym->st_info, | |
| 1199 | + put_got_entry(s1, reloc_type, sym->st_size, sym->st_info, | |
| 1200 | 1200 | sym_index); |
| 1201 | 1201 | } |
| 1202 | 1202 | break; |
| @@ -1215,7 +1215,7 @@ ST_FUNC void build_got_entries(TCCState *s1) · 12 unmodified lines | ||
| 1215 | 1215 | reloc_type = R_C60_GLOB_DAT; |
| 1216 | 1216 | else |
| 1217 | 1217 | reloc_type = R_C60_JMP_SLOT; |
| 1218 | − put_got_entry(s1, reloc_type, sym->st_size, sym->st_info, | |
| 1218 | + put_got_entry(s1, reloc_type, sym->st_size, sym->st_info, | |
| 1219 | 1219 | sym_index); |
| 1220 | 1220 | } |
| 1221 | 1221 | break; |
| @@ -1235,7 +1235,7 @@ ST_FUNC void build_got_entries(TCCState *s1) · 13 unmodified lines | ||
| 1235 | 1235 | reloc_type = R_X86_64_GLOB_DAT; |
| 1236 | 1236 | else |
| 1237 | 1237 | reloc_type = R_X86_64_JUMP_SLOT; |
| 1238 | − put_got_entry(s1, reloc_type, sym->st_size, sym->st_info, | |
| 1238 | + put_got_entry(s1, reloc_type, sym->st_size, sym->st_info, | |
| 1239 | 1239 | sym_index); |
| 1240 | 1240 | } |
| 1241 | 1241 | break; |
| @@ -1251,7 +1251,7 @@ ST_FUNC void build_got_entries(TCCState *s1) · 9 unmodified lines | ||
| 1251 | 1251 | |
| 1252 | 1252 | ST_FUNC Section *new_symtab(TCCState *s1, |
| 1253 | 1253 | const char *symtab_name, int sh_type, int sh_flags, |
| 1254 | − const char *strtab_name, | |
| 1254 | + const char *strtab_name, | |
| 1255 | 1255 | const char *hash_name, int hash_sh_flags) |
| 1256 | 1256 | { |
| 1257 | 1257 | Section *symtab, *strtab, *hash; |
| @@ -1263,7 +1263,7 @@ ST_FUNC Section *new_symtab(TCCState *s1, · 5 unmodified lines | ||
| 1263 | 1263 | put_elf_str(strtab, ""); |
| 1264 | 1264 | symtab->link = strtab; |
| 1265 | 1265 | put_elf_sym(symtab, 0, 0, 0, 0, 0, NULL); |
| 1266 | − | |
| 1266 | + | |
| 1267 | 1267 | nb_buckets = 1; |
| 1268 | 1268 | |
| 1269 | 1269 | hash = new_section(s1, hash_name, SHT_HASH, hash_sh_flags); |
| @@ -1293,7 +1293,7 @@ static void add_init_array_defines(TCCState *s1, const char *section_name) · 23 unmodified lines | ||
| 1293 | 1293 | long end_offset; |
| 1294 | 1294 | char sym_start[1024]; |
| 1295 | 1295 | char sym_end[1024]; |
| 1296 | − | |
| 1296 | + | |
| 1297 | 1297 | snprintf(sym_start, sizeof(sym_start), "__%s_start", section_name + 1); |
| 1298 | 1298 | snprintf(sym_end, sizeof(sym_end), "__%s_end", section_name + 1); |
| 1299 | 1299 | |
| @@ -1305,11 +1305,11 @@ static void add_init_array_defines(TCCState *s1, const char *section_name) · 5 unmodified lines | ||
| 1305 | 1305 | end_offset = s->data_offset; |
| 1306 | 1306 | } |
| 1307 | 1307 | |
| 1308 | − add_elf_sym(symtab_section, | |
| 1308 | + add_elf_sym(symtab_section, | |
| 1309 | 1309 | 0, 0, |
| 1310 | 1310 | ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, |
| 1311 | 1311 | s->sh_num, sym_start); |
| 1312 | − add_elf_sym(symtab_section, | |
| 1312 | + add_elf_sym(symtab_section, | |
| 1313 | 1313 | end_offset, 0, |
| 1314 | 1314 | ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, |
| 1315 | 1315 | s->sh_num, sym_end); |
| @@ -1385,15 +1385,15 @@ ST_FUNC void tcc_add_linker_symbols(TCCState *s1) · 69 unmodified lines | ||
| 1385 | 1385 | int i; |
| 1386 | 1386 | Section *s; |
| 1387 | 1387 | |
| 1388 | − add_elf_sym(symtab_section, | |
| 1388 | + add_elf_sym(symtab_section, | |
| 1389 | 1389 | text_section->data_offset, 0, |
| 1390 | 1390 | ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, |
| 1391 | 1391 | text_section->sh_num, "_etext"); |
| 1392 | − add_elf_sym(symtab_section, | |
| 1392 | + add_elf_sym(symtab_section, | |
| 1393 | 1393 | data_section->data_offset, 0, |
| 1394 | 1394 | ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, |
| 1395 | 1395 | data_section->sh_num, "_edata"); |
| 1396 | − add_elf_sym(symtab_section, | |
| 1396 | + add_elf_sym(symtab_section, | |
| 1397 | 1397 | bss_section->data_offset, 0, |
| 1398 | 1398 | ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, |
| 1399 | 1399 | bss_section->sh_num, "_end"); |
| @@ -1401,7 +1401,7 @@ ST_FUNC void tcc_add_linker_symbols(TCCState *s1) · 1 unmodified line | ||
| 1401 | 1401 | add_init_array_defines(s1, ".preinit_array"); |
| 1402 | 1402 | add_init_array_defines(s1, ".init_array"); |
| 1403 | 1403 | add_init_array_defines(s1, ".fini_array"); |
| 1404 | − | |
| 1404 | + | |
| 1405 | 1405 | /* add start and stop symbols for sections whose name can be |
| 1406 | 1406 | expressed in C */ |
| 1407 | 1407 | for(i = 1; i < s1->nb_sections; i++) { |
| @@ -1422,7 +1422,7 @@ ST_FUNC void tcc_add_linker_symbols(TCCState *s1) · 14 unmodified lines | ||
| 1422 | 1422 | p++; |
| 1423 | 1423 | } |
| 1424 | 1424 | snprintf(buf, sizeof(buf), "__start_%s", s->name); |
| 1425 | − add_elf_sym(symtab_section, | |
| 1425 | + add_elf_sym(symtab_section, | |
| 1426 | 1426 | 0, 0, |
| 1427 | 1427 | ELFW(ST_INFO)(STB_GLOBAL, STT_NOTYPE), 0, |
| 1428 | 1428 | s->sh_num, buf); |
| @@ -1459,8 +1459,8 @@ static void tcc_output_binary(TCCState *s1, FILE *f, · 30 unmodified lines | ||
| 1459 | 1459 | } |
| 1460 | 1460 | |
| 1461 | 1461 | #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) |
| 1462 | −#define HAVE_PHDR 1 | |
| 1463 | −#define EXTRA_RELITEMS 14 | |
| 1462 | +#define HAVE_PHDR 1 | |
| 1463 | +#define EXTRA_RELITEMS 14 | |
| 1464 | 1464 | |
| 1465 | 1465 | /* move the relocation value from .dynsym to .got */ |
| 1466 | 1466 | void patch_dynsym_undef(TCCState *s1, Section *s) |
| @@ -1468,19 +1468,19 @@ void patch_dynsym_undef(TCCState *s1, Section *s) · 1 unmodified line | ||
| 1468 | 1468 | uint32_t *gotd = (void *)s1->got->data; |
| 1469 | 1469 | ElfW(Sym) *sym, *sym_end; |
| 1470 | 1470 | |
| 1471 | − gotd += 3; // dummy entries in .got | |
| 1471 | + gotd += 3; /* dummy entries in .got */ | |
| 1472 | 1472 | /* relocate symbols in .dynsym */ |
| 1473 | 1473 | sym_end = (ElfW(Sym) *)(s->data + s->data_offset); |
| 1474 | 1474 | for (sym = (ElfW(Sym) *)s->data + 1; sym < sym_end; sym++) { |
| 1475 | − if (sym->st_shndx == SHN_UNDEF) { | |
| 1476 | − *gotd++ = sym->st_value + 6; // XXX 6 is magic ? | |
| 1477 | − sym->st_value = 0; | |
| 1478 | − } | |
| 1475 | + if (sym->st_shndx == SHN_UNDEF) { | |
| 1476 | + *gotd++ = sym->st_value + 6; /* XXX 6 is magic ? */ | |
| 1477 | + sym->st_value = 0; | |
| 1478 | + } | |
| 1479 | 1479 | } |
| 1480 | 1480 | } |
| 1481 | 1481 | #else |
| 1482 | −#define HAVE_PHDR 0 | |
| 1483 | −#define EXTRA_RELITEMS 9 | |
| 1482 | +#define HAVE_PHDR 0 | |
| 1483 | +#define EXTRA_RELITEMS 9 | |
| 1484 | 1484 | |
| 1485 | 1485 | /* zero plt offsets of weak symbols in .dynsym */ |
| 1486 | 1486 | void patch_dynsym_undef(TCCState *s1, Section *s) |
| @@ -1496,45 +1496,45 @@ void patch_dynsym_undef(TCCState *s1, Section *s) · 9 unmodified lines | ||
| 1496 | 1496 | |
| 1497 | 1497 | ST_FUNC void fill_got_entry(TCCState *s1, ElfW_Rel *rel) |
| 1498 | 1498 | { |
| 1499 | − int sym_index = ELFW(R_SYM) (rel->r_info); | |
| 1500 | − ElfW(Sym) *sym = &((ElfW(Sym) *) symtab_section->data)[sym_index]; | |
| 1501 | − unsigned long offset; | |
| 1502 | − | |
| 1503 | − if (sym_index >= s1->nb_sym_attrs) | |
| 1504 | − return; | |
| 1505 | − offset = s1->sym_attrs[sym_index].got_offset; | |
| 1506 | − section_reserve(s1->got, offset + PTR_SIZE); | |
| 1499 | + int sym_index = ELFW(R_SYM) (rel->r_info); | |
| 1500 | + ElfW(Sym) *sym = &((ElfW(Sym) *) symtab_section->data)[sym_index]; | |
| 1501 | + unsigned long offset; | |
| 1502 | + | |
| 1503 | + if (sym_index >= s1->nb_sym_attrs) | |
| 1504 | + return; | |
| 1505 | + offset = s1->sym_attrs[sym_index].got_offset; | |
| 1506 | + section_reserve(s1->got, offset + PTR_SIZE); | |
| 1507 | 1507 | #ifdef TCC_TARGET_X86_64 |
| 1508 | − /* only works for x86-64 */ | |
| 1509 | − put32(s1->got->data + offset + 4, sym->st_value >> 32); | |
| 1508 | + /* only works for x86-64 */ | |
| 1509 | + put32(s1->got->data + offset + 4, sym->st_value >> 32); | |
| 1510 | 1510 | #endif |
| 1511 | − put32(s1->got->data + offset, sym->st_value & 0xffffffff); | |
| 1511 | + put32(s1->got->data + offset, sym->st_value & 0xffffffff); | |
| 1512 | 1512 | } |
| 1513 | 1513 | |
| 1514 | 1514 | ST_FUNC void fill_got(TCCState *s1) |
| 1515 | 1515 | { |
| 1516 | − Section *s; | |
| 1517 | − ElfW_Rel *rel, *rel_end; | |
| 1518 | − int i; | |
| 1519 | − | |
| 1520 | − for(i = 1; i < s1->nb_sections; i++) { | |
| 1521 | − s = s1->sections[i]; | |
| 1522 | − if (s->sh_type != SHT_RELX) | |
| 1523 | − continue; | |
| 1524 | − /* no need to handle got relocations */ | |
| 1525 | − if (s->link != symtab_section) | |
| 1526 | − continue; | |
| 1527 | − rel_end = (ElfW_Rel *) (s->data + s->data_offset); | |
| 1528 | − for(rel = (ElfW_Rel *) s->data; rel < rel_end; rel++) { | |
| 1529 | − switch (ELFW(R_TYPE) (rel->r_info)) { | |
| 1530 | − case R_X86_64_GOT32: | |
| 1531 | − case R_X86_64_GOTPCREL: | |
| 1532 | − case R_X86_64_PLT32: | |
| 1533 | − fill_got_entry(s1, rel); | |
| 1534 | − break; | |
| 1535 | − } | |
| 1536 | − } | |
| 1537 | − } | |
| 1516 | + Section *s; | |
| 1517 | + ElfW_Rel *rel, *rel_end; | |
| 1518 | + int i; | |
| 1519 | + | |
| 1520 | + for(i = 1; i < s1->nb_sections; i++) { | |
| 1521 | + s = s1->sections[i]; | |
| 1522 | + if (s->sh_type != SHT_RELX) | |
| 1523 | + continue; | |
| 1524 | + /* no need to handle got relocations */ | |
| 1525 | + if (s->link != symtab_section) | |
| 1526 | + continue; | |
| 1527 | + rel_end = (ElfW_Rel *) (s->data + s->data_offset); | |
| 1528 | + for(rel = (ElfW_Rel *) s->data; rel < rel_end; rel++) { | |
| 1529 | + switch (ELFW(R_TYPE) (rel->r_info)) { | |
| 1530 | + case R_X86_64_GOT32: | |
| 1531 | + case R_X86_64_GOTPCREL: | |
| 1532 | + case R_X86_64_PLT32: | |
| 1533 | + fill_got_entry(s1, rel); | |
| 1534 | + break; | |
| 1535 | + } | |
| 1536 | + } | |
| 1537 | + } | |
| 1538 | 1538 | } |
| 1539 | 1539 | |
| 1540 | 1540 | |
| @@ -1574,7 +1574,7 @@ static int elf_output_file(TCCState *s1, const char *filename) · 33 unmodified lines | ||
| 1574 | 1574 | dynamic = NULL; |
| 1575 | 1575 | dynstr = NULL; /* avoid warning */ |
| 1576 | 1576 | saved_dynamic_data_offset = 0; /* avoid warning */ |
| 1577 | − | |
| 1577 | + | |
| 1578 | 1578 | if (file_type != TCC_OUTPUT_OBJ) { |
| 1579 | 1579 | relocate_common_syms(); |
| 1580 | 1580 | |
| @@ -1587,10 +1587,10 @@ static int elf_output_file(TCCState *s1, const char *filename) · 6 unmodified lines | ||
| 1587 | 1587 | |
| 1588 | 1588 | if (file_type == TCC_OUTPUT_EXE) { |
| 1589 | 1589 | char *ptr; |
| 1590 | − /* allow override the dynamic loader */ | |
| 1591 | − const char *elfint = getenv("LD_SO"); | |
| 1592 | − if (elfint == NULL) | |
| 1593 | − elfint = DEFAULT_ELFINTERP(s1); | |
| 1590 | + /* allow override the dynamic loader */ | |
| 1591 | + const char *elfint = getenv("LD_SO"); | |
| 1592 | + if (elfint == NULL) | |
| 1593 | + elfint = DEFAULT_ELFINTERP(s1); | |
| 1594 | 1594 | /* add interpreter section only if executable */ |
| 1595 | 1595 | interp = new_section(s1, ".interp", SHT_PROGBITS, SHF_ALLOC); |
| 1596 | 1596 | interp->sh_addralign = 1; |
| @@ -1600,18 +1600,18 @@ static int elf_output_file(TCCState *s1, const char *filename) · 3 unmodified lines | ||
| 1600 | 1600 | |
| 1601 | 1601 | /* add dynamic symbol table */ |
| 1602 | 1602 | s1->dynsym = new_symtab(s1, ".dynsym", SHT_DYNSYM, SHF_ALLOC, |
| 1603 | − ".dynstr", | |
| 1603 | + ".dynstr", | |
| 1604 | 1604 | ".hash", SHF_ALLOC); |
| 1605 | 1605 | dynstr = s1->dynsym->link; |
| 1606 | − | |
| 1606 | + | |
| 1607 | 1607 | /* add dynamic section */ |
| 1608 | − dynamic = new_section(s1, ".dynamic", SHT_DYNAMIC, | |
| 1608 | + dynamic = new_section(s1, ".dynamic", SHT_DYNAMIC, | |
| 1609 | 1609 | SHF_ALLOC | SHF_WRITE); |
| 1610 | 1610 | dynamic->link = dynstr; |
| 1611 | 1611 | dynamic->sh_entsize = sizeof(ElfW(Dyn)); |
| 1612 | − | |
| 1612 | + | |
| 1613 | 1613 | /* add PLT */ |
| 1614 | − s1->plt = new_section(s1, ".plt", SHT_PROGBITS, | |
| 1614 | + s1->plt = new_section(s1, ".plt", SHT_PROGBITS, | |
| 1615 | 1615 | SHF_ALLOC | SHF_EXECINSTR); |
| 1616 | 1616 | s1->plt->sh_entsize = 4; |
| 1617 | 1617 | |
| @@ -1643,7 +1643,7 @@ static int elf_output_file(TCCState *s1, const char *filename) · 25 unmodified lines | ||
| 1643 | 1643 | * function wanted by the caller of dlsym |
| 1644 | 1644 | * instead of the address of the function that |
| 1645 | 1645 | * would return that address */ |
| 1646 | − put_got_entry(s1, R_JMP_SLOT, esym->st_size, | |
| 1646 | + put_got_entry(s1, R_JMP_SLOT, esym->st_size, | |
| 1647 | 1647 | ELFW(ST_INFO)(STB_GLOBAL,STT_FUNC), |
| 1648 | 1648 | sym - (ElfW(Sym) *)symtab_section->data); |
| 1649 | 1649 | } else if (type == STT_OBJECT) { |
| @@ -1652,10 +1652,10 @@ static int elf_output_file(TCCState *s1, const char *filename) · 2 unmodified lines | ||
| 1652 | 1652 | offset = bss_section->data_offset; |
| 1653 | 1653 | /* XXX: which alignment ? */ |
| 1654 | 1654 | offset = (offset + 16 - 1) & -16; |
| 1655 | − index = put_elf_sym(s1->dynsym, offset, esym->st_size, | |
| 1656 | − esym->st_info, 0, | |
| 1655 | + index = put_elf_sym(s1->dynsym, offset, esym->st_size, | |
| 1656 | + esym->st_info, 0, | |
| 1657 | 1657 | bss_section->sh_num, name); |
| 1658 | − // Ensure R_COPY works for weak symbol aliases | |
| 1658 | + /* Ensure R_COPY works for weak symbol aliases */ | |
| 1659 | 1659 | if (ELFW(ST_BIND)(esym->st_info) == STB_WEAK) { |
| 1660 | 1660 | dynsym_end = (ElfW(Sym) *) |
| 1661 | 1661 | (s1->dynsymtab_section->data + |
| @@ -1676,7 +1676,7 @@ static int elf_output_file(TCCState *s1, const char *filename) · 14 unmodified lines | ||
| 1676 | 1676 | } |
| 1677 | 1677 | } |
| 1678 | 1678 | } |
| 1679 | − put_elf_reloc(s1->dynsym, bss_section, | |
| 1679 | + put_elf_reloc(s1->dynsym, bss_section, | |
| 1680 | 1680 | offset, R_COPY, index); |
| 1681 | 1681 | offset += esym->st_size; |
| 1682 | 1682 | bss_section->data_offset = offset; |
| @@ -1691,17 +1691,17 @@ static int elf_output_file(TCCState *s1, const char *filename) · 8 unmodified lines | ||
| 1691 | 1691 | tcc_error_noabort("undefined symbol '%s'", name); |
| 1692 | 1692 | } |
| 1693 | 1693 | } |
| 1694 | − } else if (s1->rdynamic && | |
| 1694 | + } else if (s1->rdynamic && | |
| 1695 | 1695 | ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) { |
| 1696 | 1696 | /* if -rdynamic option, then export all non |
| 1697 | 1697 | local symbols */ |
| 1698 | 1698 | name = symtab_section->link->data + sym->st_name; |
| 1699 | − put_elf_sym(s1->dynsym, sym->st_value, sym->st_size, | |
| 1700 | − sym->st_info, 0, | |
| 1699 | + put_elf_sym(s1->dynsym, sym->st_value, sym->st_size, | |
| 1700 | + sym->st_info, 0, | |
| 1701 | 1701 | sym->st_shndx, name); |
| 1702 | 1702 | } |
| 1703 | 1703 | } |
| 1704 | − | |
| 1704 | + | |
| 1705 | 1705 | if (s1->nb_errors) |
| 1706 | 1706 | goto fail; |
| 1707 | 1707 | |
| @@ -1719,8 +1719,8 @@ static int elf_output_file(TCCState *s1, const char *filename) · 11 unmodified lines | ||
| 1719 | 1719 | /* XXX: avoid adding a symbol if already |
| 1720 | 1720 | present because of -rdynamic ? */ |
| 1721 | 1721 | sym = &((ElfW(Sym) *)symtab_section->data)[sym_index]; |
| 1722 | − put_elf_sym(s1->dynsym, sym->st_value, sym->st_size, | |
| 1723 | − sym->st_info, 0, | |
| 1722 | + put_elf_sym(s1->dynsym, sym->st_value, sym->st_size, | |
| 1723 | + sym->st_info, 0, | |
| 1724 | 1724 | sym->st_shndx, name); |
| 1725 | 1725 | } else { |
| 1726 | 1726 | if (ELFW(ST_BIND)(esym->st_info) == STB_WEAK) { |
| @@ -1745,24 +1745,24 @@ static int elf_output_file(TCCState *s1, const char *filename) · 18 unmodified lines | ||
| 1745 | 1745 | ELFW(ST_TYPE)(sym->st_info) == STT_GNU_IFUNC) |
| 1746 | 1746 | && sym->st_shndx == SHN_UNDEF) { |
| 1747 | 1747 | int visibility = ELFW(ST_BIND)(sym->st_info); |
| 1748 | − put_got_entry(s1, R_JMP_SLOT, sym->st_size, | |
| 1748 | + put_got_entry(s1, R_JMP_SLOT, sym->st_size, | |
| 1749 | 1749 | ELFW(ST_INFO)(visibility,STT_FUNC), |
| 1750 | 1750 | sym - (ElfW(Sym) *)symtab_section->data); |
| 1751 | 1751 | } |
| 1752 | 1752 | else if (ELFW(ST_TYPE)(sym->st_info) == STT_OBJECT) { |
| 1753 | − put_got_entry(s1, R_X86_64_GLOB_DAT, sym->st_size, | |
| 1754 | − sym->st_info, | |
| 1753 | + put_got_entry(s1, R_X86_64_GLOB_DAT, sym->st_size, | |
| 1754 | + sym->st_info, | |
| 1755 | 1755 | sym - (ElfW(Sym) *)symtab_section->data); |
| 1756 | 1756 | } |
| 1757 | 1757 | else |
| 1758 | 1758 | #endif |
| 1759 | 1759 | { |
| 1760 | 1760 | name = symtab_section->link->data + sym->st_name; |
| 1761 | − index = put_elf_sym(s1->dynsym, sym->st_value, sym->st_size, | |
| 1762 | − sym->st_info, 0, | |
| 1761 | + index = put_elf_sym(s1->dynsym, sym->st_value, sym->st_size, | |
| 1762 | + sym->st_info, 0, | |
| 1763 | 1763 | sym->st_shndx, name); |
| 1764 | − s1->symtab_to_dynsym[sym - | |
| 1765 | − (ElfW(Sym) *)symtab_section->data] = | |
| 1764 | + s1->symtab_to_dynsym[sym - | |
| 1765 | + (ElfW(Sym) *)symtab_section->data] = | |
| 1766 | 1766 | index; |
| 1767 | 1767 | } |
| 1768 | 1768 | } |
| @@ -1770,7 +1770,7 @@ static int elf_output_file(TCCState *s1, const char *filename) · 1 unmodified line | ||
| 1770 | 1770 | } |
| 1771 | 1771 | |
| 1772 | 1772 | build_got_entries(s1); |
| 1773 | − | |
| 1773 | + | |
| 1774 | 1774 | /* add a list of needed dlls */ |
| 1775 | 1775 | for(i = 0; i < s1->nb_loaded_dlls; i++) { |
| 1776 | 1776 | DLLReference *dllref = s1->loaded_dlls[i]; |
| @@ -1806,7 +1806,7 @@ static int elf_output_file(TCCState *s1, const char *filename) · 29 unmodified lines | ||
| 1806 | 1806 | /* we add a section for symbols */ |
| 1807 | 1807 | strsec = new_section(s1, ".shstrtab", SHT_STRTAB, 0); |
| 1808 | 1808 | put_elf_str(strsec, ""); |
| 1809 | − | |
| 1809 | + | |
| 1810 | 1810 | /* compute number of sections */ |
| 1811 | 1811 | shnum = s1->nb_sections; |
| 1812 | 1812 | |
| @@ -1814,7 +1814,7 @@ static int elf_output_file(TCCState *s1, const char *filename) · 1 unmodified line | ||
| 1814 | 1814 | section_order = tcc_malloc(sizeof(int) * shnum); |
| 1815 | 1815 | section_order[0] = 0; |
| 1816 | 1816 | sh_order_index = 1; |
| 1817 | − | |
| 1817 | + | |
| 1818 | 1818 | /* compute number of program headers */ |
| 1819 | 1819 | switch(file_type) { |
| 1820 | 1820 | default: |
| @@ -1839,27 +1839,18 @@ static int elf_output_file(TCCState *s1, const char *filename) · 18 unmodified lines | ||
| 1839 | 1839 | for(i = 1; i < s1->nb_sections; i++) { |
| 1840 | 1840 | s = s1->sections[i]; |
| 1841 | 1841 | s->sh_name = put_elf_str(strsec, s->name); |
| 1842 | −#if 0 /* gr */ | |
| 1843 | − printf("section: f=%08x t=%08x i=%08x %s %s\n", | |
| 1844 | − s->sh_flags, | |
| 1845 | − s->sh_type, | |
| 1846 | − s->sh_info, | |
| 1847 | − s->name, | |
| 1848 | − s->reloc ? s->reloc->name : "n" | |
| 1849 | − ); | |
| 1850 | −#endif | |
| 1851 | 1842 | /* when generating a DLL, we include relocations but we may |
| 1852 | 1843 | patch them */ |
| 1853 | − if (file_type == TCC_OUTPUT_DLL && | |
| 1854 | − s->sh_type == SHT_RELX && | |
| 1844 | + if (file_type == TCC_OUTPUT_DLL && | |
| 1845 | + s->sh_type == SHT_RELX && | |
| 1855 | 1846 | !(s->sh_flags & SHF_ALLOC)) { |
| 1856 | − /* //gr: avoid bogus relocs for empty (debug) sections */ | |
| 1847 | + /* gr: avoid bogus relocs for empty (debug) sections */ | |
| 1857 | 1848 | if (s1->sections[s->sh_info]->sh_flags & SHF_ALLOC) |
| 1858 | 1849 | prepare_dynamic_rel(s1, s); |
| 1859 | 1850 | else if (s1->do_debug) |
| 1860 | 1851 | s->sh_size = s->data_offset; |
| 1861 | 1852 | } else if (s1->do_debug || |
| 1862 | − file_type == TCC_OUTPUT_OBJ || | |
| 1853 | + file_type == TCC_OUTPUT_OBJ || | |
| 1863 | 1854 | (s->sh_flags & SHF_ALLOC) || |
| 1864 | 1855 | i == (s1->nb_sections - 1)) { |
| 1865 | 1856 | /* we output all sections if debug or object file */ |
| @@ -1869,7 +1860,7 @@ static int elf_output_file(TCCState *s1, const char *filename) · 3 unmodified lines | ||
| 1869 | 1860 | |
| 1870 | 1861 | /* allocate program segment headers */ |
| 1871 | 1862 | phdr = tcc_mallocz(phnum * sizeof(ElfW(Phdr))); |
| 1872 | − | |
| 1863 | + | |
| 1873 | 1864 | if (s1->output_format == TCC_OUTPUT_FORMAT_ELF) { |
| 1874 | 1865 | file_offset = sizeof(ElfW(Ehdr)) + phnum * sizeof(ElfW(Phdr)); |
| 1875 | 1866 | } else { |
| @@ -1877,14 +1868,14 @@ static int elf_output_file(TCCState *s1, const char *filename) · 1 unmodified line | ||
| 1877 | 1868 | } |
| 1878 | 1869 | if (phnum > 0) { |
| 1879 | 1870 | /* compute section to program header mapping */ |
| 1880 | − if (s1->has_text_addr) { | |
| 1871 | + if (s1->has_text_addr) { | |
| 1881 | 1872 | int a_offset, p_offset; |
| 1882 | 1873 | addr = s1->text_addr; |
| 1883 | 1874 | /* we ensure that (addr % ELF_PAGE_SIZE) == file_offset % |
| 1884 | 1875 | ELF_PAGE_SIZE */ |
| 1885 | 1876 | a_offset = (int) (addr & (s1->section_align - 1)); |
| 1886 | 1877 | p_offset = file_offset & (s1->section_align - 1); |
| 1887 | − if (a_offset < p_offset) | |
| 1878 | + if (a_offset < p_offset) | |
| 1888 | 1879 | a_offset += s1->section_align; |
| 1889 | 1880 | file_offset += (a_offset - p_offset); |
| 1890 | 1881 | } else { |
| @@ -1895,7 +1886,7 @@ static int elf_output_file(TCCState *s1, const char *filename) · 4 unmodified lines | ||
| 1895 | 1886 | /* compute address after headers */ |
| 1896 | 1887 | addr += (file_offset & (s1->section_align - 1)); |
| 1897 | 1888 | } |
| 1898 | − | |
| 1889 | + | |
| 1899 | 1890 | /* dynamic relocation table information, for .dynamic section */ |
| 1900 | 1891 | rel_size = 0; |
| 1901 | 1892 | rel_addr = 0; |
| @@ -1915,7 +1906,7 @@ static int elf_output_file(TCCState *s1, const char *filename) · 13 unmodified lines | ||
| 1915 | 1906 | else |
| 1916 | 1907 | ph->p_flags = PF_R | PF_W; |
| 1917 | 1908 | ph->p_align = s1->section_align; |
| 1918 | − | |
| 1909 | + | |
| 1919 | 1910 | /* we do the following ordering: interp, symbol tables, |
| 1920 | 1911 | relocations, progbits, nobits */ |
| 1921 | 1912 | /* XXX: do faster and simpler sorting */ |
| @@ -1924,11 +1915,11 @@ static int elf_output_file(TCCState *s1, const char *filename) · 2 unmodified lines | ||
| 1924 | 1915 | s = s1->sections[i]; |
| 1925 | 1916 | /* compute if section should be included */ |
| 1926 | 1917 | if (j == 0) { |
| 1927 | − if ((s->sh_flags & (SHF_ALLOC | SHF_WRITE)) != | |
| 1918 | + if ((s->sh_flags & (SHF_ALLOC | SHF_WRITE)) != | |
| 1928 | 1919 | SHF_ALLOC) |
| 1929 | 1920 | continue; |
| 1930 | 1921 | } else { |
| 1931 | − if ((s->sh_flags & (SHF_ALLOC | SHF_WRITE)) != | |
| 1922 | + if ((s->sh_flags & (SHF_ALLOC | SHF_WRITE)) != | |
| 1932 | 1923 | (SHF_ALLOC | SHF_WRITE)) |
| 1933 | 1924 | continue; |
| 1934 | 1925 | } |
| @@ -1954,12 +1945,12 @@ static int elf_output_file(TCCState *s1, const char *filename) · 19 unmodified lines | ||
| 1954 | 1945 | |
| 1955 | 1946 | /* section matches: we align it and add its size */ |
| 1956 | 1947 | tmp = addr; |
| 1957 | − addr = (addr + s->sh_addralign - 1) & | |
| 1948 | + addr = (addr + s->sh_addralign - 1) & | |
| 1958 | 1949 | ~(s->sh_addralign - 1); |
| 1959 | 1950 | file_offset += (int) ( addr - tmp ); |
| 1960 | 1951 | s->sh_offset = file_offset; |
| 1961 | 1952 | s->sh_addr = addr; |
| 1962 | − | |
| 1953 | + | |
| 1963 | 1954 | /* update program header infos */ |
| 1964 | 1955 | if (ph->p_offset == 0) { |
| 1965 | 1956 | ph->p_offset = file_offset; |
| @@ -1969,14 +1960,14 @@ static int elf_output_file(TCCState *s1, const char *filename) · 3 unmodified lines | ||
| 1969 | 1960 | /* update dynamic relocation infos */ |
| 1970 | 1961 | if (s->sh_type == SHT_RELX) { |
| 1971 | 1962 | #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) |
| 1972 | − if (!strcmp(strsec->data + s->sh_name, ".rel.got")) { // rel_size == 0) { | |
| 1963 | + if (!strcmp(strsec->data + s->sh_name, ".rel.got")) { | |
| 1973 | 1964 | rel_addr = addr; |
| 1974 | − rel_size += s->sh_size; // XXX only first rel. | |
| 1975 | − } | |
| 1976 | − if (!strcmp(strsec->data + s->sh_name, ".rel.bss")) { // rel_size == 0) { | |
| 1965 | + rel_size += s->sh_size; /* XXX only first rel. */ | |
| 1966 | + } | |
| 1967 | + if (!strcmp(strsec->data + s->sh_name, ".rel.bss")) { | |
| 1977 | 1968 | bss_addr = addr; |
| 1978 | − bss_size = s->sh_size; // XXX only first rel. | |
| 1979 | − } | |
| 1969 | + bss_size = s->sh_size; /* XXX only first rel. */ | |
| 1970 | + } | |
| 1980 | 1971 | #else |
| 1981 | 1972 | if (rel_size == 0) |
| 1982 | 1973 | rel_addr = addr; |
| @@ -2010,18 +2001,18 @@ static int elf_output_file(TCCState *s1, const char *filename) · 27 unmodified lines | ||
| 2010 | 2001 | ph = &phdr[0]; |
| 2011 | 2002 | |
| 2012 | 2003 | #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) |
| 2013 | − { | |
| 2014 | − int len = phnum * sizeof(ElfW(Phdr)); | |
| 2015 | − | |
| 2016 | − ph->p_type = PT_PHDR; | |
| 2017 | − ph->p_offset = sizeof(ElfW(Ehdr)); | |
| 2018 | − ph->p_vaddr = interp->sh_addr - len; | |
| 2019 | − ph->p_paddr = ph->p_vaddr; | |
| 2020 | − ph->p_filesz = ph->p_memsz = len; | |
| 2021 | − ph->p_flags = PF_R | PF_X; | |
| 2022 | − ph->p_align = 4; // interp->sh_addralign; | |
| 2023 | − ph++; | |
| 2024 | − } | |
| 2004 | + { | |
| 2005 | + int len = phnum * sizeof(ElfW(Phdr)); | |
| 2006 | + | |
| 2007 | + ph->p_type = PT_PHDR; | |
| 2008 | + ph->p_offset = sizeof(ElfW(Ehdr)); | |
| 2009 | + ph->p_vaddr = interp->sh_addr - len; | |
| 2010 | + ph->p_paddr = ph->p_vaddr; | |
| 2011 | + ph->p_filesz = ph->p_memsz = len; | |
| 2012 | + ph->p_flags = PF_R | PF_X; | |
| 2013 | + ph->p_align = 4; /* interp->sh_addralign; */ | |
| 2014 | + ph++; | |
| 2015 | + } | |
| 2025 | 2016 | #endif |
| 2026 | 2017 | |
| 2027 | 2018 | ph->p_type = PT_INTERP; |
| @@ -2033,13 +2024,13 @@ static int elf_output_file(TCCState *s1, const char *filename) · 5 unmodified lines | ||
| 2033 | 2024 | ph->p_flags = PF_R; |
| 2034 | 2025 | ph->p_align = interp->sh_addralign; |
| 2035 | 2026 | } |
| 2036 | − | |
| 2027 | + | |
| 2037 | 2028 | /* if dynamic section, then add corresponing program header */ |
| 2038 | 2029 | if (dynamic) { |
| 2039 | 2030 | ElfW(Sym) *sym_end; |
| 2040 | 2031 | |
| 2041 | 2032 | ph = &phdr[phnum - 1]; |
| 2042 | − | |
| 2033 | + | |
| 2043 | 2034 | ph->p_type = PT_DYNAMIC; |
| 2044 | 2035 | ph->p_offset = dynamic->sh_offset; |
| 2045 | 2036 | ph->p_vaddr = dynamic->sh_addr; |
| @@ -2155,14 +2146,14 @@ static int elf_output_file(TCCState *s1, const char *filename) · 109 unmodified lines | ||
| 2155 | 2146 | if (phnum > 0 && (s->sh_flags & SHF_ALLOC)) |
| 2156 | 2147 | continue; |
| 2157 | 2148 | section_order[sh_order_index++] = i; |
| 2158 | − | |
| 2159 | − file_offset = (file_offset + s->sh_addralign - 1) & | |
| 2149 | + | |
| 2150 | + file_offset = (file_offset + s->sh_addralign - 1) & | |
| 2160 | 2151 | ~(s->sh_addralign - 1); |
| 2161 | 2152 | s->sh_offset = file_offset; |
| 2162 | 2153 | if (s->sh_type != SHT_NOBITS) |
| 2163 | 2154 | file_offset += s->sh_size; |
| 2164 | 2155 | } |
| 2165 | − | |
| 2156 | + | |
| 2166 | 2157 | /* if building executable or DLL, then relocate each section |
| 2167 | 2158 | except the GOT which is already relocated */ |
| 2168 | 2159 | if (file_type != TCC_OUTPUT_OBJ) { |
| @@ -2207,7 +2198,7 @@ static int elf_output_file(TCCState *s1, const char *filename) · 38 unmodified lines | ||
| 2207 | 2198 | else |
| 2208 | 2199 | mode = 0777; |
| 2209 | 2200 | unlink(filename); |
| 2210 | − fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, mode); | |
| 2201 | + fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, mode); | |
| 2211 | 2202 | if (fd < 0) { |
| 2212 | 2203 | tcc_error_noabort("could not write '%s'", filename); |
| 2213 | 2204 | goto fail; |
| @@ -2223,10 +2214,10 @@ static int elf_output_file(TCCState *s1, const char *filename) · 9 unmodified lines | ||
| 2223 | 2214 | #endif |
| 2224 | 2215 | if (s1->output_format == TCC_OUTPUT_FORMAT_ELF) { |
| 2225 | 2216 | sort_syms(s1, symtab_section); |
| 2226 | − | |
| 2217 | + | |
| 2227 | 2218 | /* align to 4 */ |
| 2228 | 2219 | file_offset = (file_offset + 3) & -4; |
| 2229 | − | |
| 2220 | + | |
| 2230 | 2221 | /* fill header */ |
| 2231 | 2222 | ehdr.e_ident[0] = ELFMAG0; |
| 2232 | 2223 | ehdr.e_ident[1] = ELFMAG1; |
| @@ -2271,7 +2262,7 @@ static int elf_output_file(TCCState *s1, const char *filename) · 38 unmodified lines | ||
| 2271 | 2262 | ehdr.e_shentsize = sizeof(ElfW(Shdr)); |
| 2272 | 2263 | ehdr.e_shnum = shnum; |
| 2273 | 2264 | ehdr.e_shstrndx = shnum - 1; |
| 2274 | − | |
| 2265 | + | |
| 2275 | 2266 | fwrite(&ehdr, 1, sizeof(ElfW(Ehdr)), f); |
| 2276 | 2267 | fwrite(phdr, 1, phnum * sizeof(ElfW(Phdr)), f); |
| 2277 | 2268 | offset = sizeof(ElfW(Ehdr)) + phnum * sizeof(ElfW(Phdr)); |
| @@ -2296,7 +2287,7 @@ static int elf_output_file(TCCState *s1, const char *filename) · 18 unmodified lines | ||
| 2296 | 2287 | fputc(0, f); |
| 2297 | 2288 | offset++; |
| 2298 | 2289 | } |
| 2299 | − | |
| 2290 | + | |
| 2300 | 2291 | for(i=0;i<s1->nb_sections;i++) { |
| 2301 | 2292 | sh = &shdr; |
| 2302 | 2293 | memset(sh, 0, sizeof(ElfW(Shdr))); |
| @@ -2363,9 +2354,9 @@ typedef struct SectionMergeInfo { · 60 unmodified lines | ||
| 2363 | 2354 | |
| 2364 | 2355 | /* load an object file and merge it with current files */ |
| 2365 | 2356 | /* XXX: handle correctly stab (debug) info */ |
| 2366 | −ST_FUNC int tcc_load_object_file(TCCState *s1, | |
| 2357 | +ST_FUNC int tcc_load_object_file(TCCState *s1, | |
| 2367 | 2358 | int fd, unsigned long file_offset) |
| 2368 | −{ | |
| 2359 | +{ | |
| 2369 | 2360 | ElfW(Ehdr) ehdr; |
| 2370 | 2361 | ElfW(Shdr) *shdr, *sh; |
| 2371 | 2362 | int size, i, j, offset, offseti, nb_syms, sym_index, ret; |
| @@ -2400,10 +2391,10 @@ ST_FUNC int tcc_load_object_file(TCCState *s1, · 28 unmodified lines | ||
| 2400 | 2391 | return -1; |
| 2401 | 2392 | } |
| 2402 | 2393 | /* read sections */ |
| 2403 | − shdr = load_data(fd, file_offset + ehdr.e_shoff, | |
| 2394 | + shdr = load_data(fd, file_offset + ehdr.e_shoff, | |
| 2404 | 2395 | sizeof(ElfW(Shdr)) * ehdr.e_shnum); |
| 2405 | 2396 | sm_table = tcc_mallocz(sizeof(SectionMergeInfo) * ehdr.e_shnum); |
| 2406 | − | |
| 2397 | + | |
| 2407 | 2398 | /* load section names */ |
| 2408 | 2399 | sh = &shdr[ehdr.e_shstrndx]; |
| 2409 | 2400 | strsec = load_data(fd, file_offset + sh->sh_offset, sh->sh_size); |
| @@ -2431,7 +2422,7 @@ ST_FUNC int tcc_load_object_file(TCCState *s1, · 21 unmodified lines | ||
| 2431 | 2422 | strtab = load_data(fd, file_offset + sh->sh_offset, sh->sh_size); |
| 2432 | 2423 | } |
| 2433 | 2424 | } |
| 2434 | − | |
| 2425 | + | |
| 2435 | 2426 | /* now examine each section and try to merge its content with the |
| 2436 | 2427 | ones in memory */ |
| 2437 | 2428 | for(i = 1; i < ehdr.e_shnum; i++) { |
| @@ -2442,11 +2433,11 @@ ST_FUNC int tcc_load_object_file(TCCState *s1, · 4 unmodified lines | ||
| 2442 | 2433 | sh_name = strsec + sh->sh_name; |
| 2443 | 2434 | /* ignore sections types we do not handle */ |
| 2444 | 2435 | if (sh->sh_type != SHT_PROGBITS && |
| 2445 | − sh->sh_type != SHT_RELX && | |
| 2436 | + sh->sh_type != SHT_RELX && | |
| 2446 | 2437 | #ifdef TCC_ARM_EABI |
| 2447 | 2438 | sh->sh_type != SHT_ARM_EXIDX && |
| 2448 | 2439 | #endif |
| 2449 | − sh->sh_type != SHT_NOBITS && | |
| 2440 | + sh->sh_type != SHT_NOBITS && | |
| 2450 | 2441 | sh->sh_type != SHT_PREINIT_ARRAY && |
| 2451 | 2442 | sh->sh_type != SHT_INIT_ARRAY && |
| 2452 | 2443 | sh->sh_type != SHT_FINI_ARRAY && |
| @@ -2459,7 +2450,7 @@ ST_FUNC int tcc_load_object_file(TCCState *s1, · 6 unmodified lines | ||
| 2459 | 2450 | for(j = 1; j < s1->nb_sections;j++) { |
| 2460 | 2451 | s = s1->sections[j]; |
| 2461 | 2452 | if (!strcmp(s->name, sh_name)) { |
| 2462 | − if (!strncmp(sh_name, ".gnu.linkonce", | |
| 2453 | + if (!strncmp(sh_name, ".gnu.linkonce", | |
| 2463 | 2454 | sizeof(".gnu.linkonce") - 1)) { |
| 2464 | 2455 | /* if a 'linkonce' section is already present, we |
| 2465 | 2456 | do not add it again. It is a little tricky as |
| @@ -2518,7 +2509,7 @@ ST_FUNC int tcc_load_object_file(TCCState *s1, · 52 unmodified lines | ||
| 2518 | 2509 | next: ; |
| 2519 | 2510 | } |
| 2520 | 2511 | |
| 2521 | − /* //gr relocate stab strings */ | |
| 2512 | + /* gr relocate stab strings */ | |
| 2522 | 2513 | if (stab_index && stabstr_index) { |
| 2523 | 2514 | Stab_Sym *a, *b; |
| 2524 | 2515 | unsigned o; |
| @@ -2526,7 +2517,7 @@ ST_FUNC int tcc_load_object_file(TCCState *s1, · 1 unmodified line | ||
| 2526 | 2517 | a = (Stab_Sym *)(s->data + sm_table[stab_index].offset); |
| 2527 | 2518 | b = (Stab_Sym *)(s->data + s->data_offset); |
| 2528 | 2519 | o = sm_table[stabstr_index].offset; |
| 2529 | − while (a < b) | |
| 2520 | + while (a < b) | |
| 2530 | 2521 | a->n_strx += o, a++; |
| 2531 | 2522 | } |
| 2532 | 2523 | |
| @@ -2577,8 +2568,8 @@ ST_FUNC int tcc_load_object_file(TCCState *s1, · 44 unmodified lines | ||
| 2577 | 2568 | } |
| 2578 | 2569 | /* add symbol */ |
| 2579 | 2570 | name = strtab + sym->st_name; |
| 2580 | − sym_index = add_elf_sym(symtab_section, sym->st_value, sym->st_size, | |
| 2581 | − sym->st_info, sym->st_other, | |
| 2571 | + sym_index = add_elf_sym(symtab_section, sym->st_value, sym->st_size, | |
| 2572 | + sym->st_info, sym->st_other, | |
| 2582 | 2573 | sym->st_shndx, name); |
| 2583 | 2574 | old_to_new_syms[i] = sym_index; |
| 2584 | 2575 | } |
| @@ -2639,7 +2630,7 @@ ST_FUNC int tcc_load_object_file(TCCState *s1, · 54 unmodified lines | ||
| 2639 | 2630 | break; |
| 2640 | 2631 | } |
| 2641 | 2632 | } |
| 2642 | − | |
| 2633 | + | |
| 2643 | 2634 | ret = 0; |
| 2644 | 2635 | the_end: |
| 2645 | 2636 | tcc_free(symtab); |
| @@ -2690,9 +2681,6 @@ static int tcc_load_alacarte(TCCState *s1, int fd, int size) · 44 unmodified lines | ||
| 2690 | 2681 | sym = &((ElfW(Sym) *)symtab_section->data)[sym_index]; |
| 2691 | 2682 | if(sym->st_shndx == SHN_UNDEF) { |
| 2692 | 2683 | off = get_be32(ar_index + i * 4) + sizeof(ArchiveHeader); |
| 2693 | −#if 0 | |
| 2694 | − printf("%5d\t%s\t%08x\n", i, p, sym->st_shndx); | |
| 2695 | −#endif | |
| 2696 | 2684 | ++bound; |
| 2697 | 2685 | lseek(fd, off, SEEK_SET); |
| 2698 | 2686 | if(tcc_load_object_file(s1, fd, off) < 0) { |
| @@ -2722,7 +2710,7 @@ ST_FUNC int tcc_load_archive(TCCState *s1, int fd) · 23 unmodified lines | ||
| 2722 | 2710 | |
| 2723 | 2711 | /* skip magic which was already checked */ |
| 2724 | 2712 | read(fd, magic, sizeof(magic)); |
| 2725 | − | |
| 2713 | + | |
| 2726 | 2714 | for(;;) { |
| 2727 | 2715 | len = read(fd, &hdr, sizeof(hdr)); |
| 2728 | 2716 | if (len == 0) |
| @@ -2740,7 +2728,6 @@ ST_FUNC int tcc_load_archive(TCCState *s1, int fd) · 11 unmodified lines | ||
| 2740 | 2728 | break; |
| 2741 | 2729 | } |
| 2742 | 2730 | ar_name[i + 1] = '\0'; |
| 2743 | − // printf("name='%s' size=%d %s\n", ar_name, size, ar_size); | |
| 2744 | 2731 | file_offset = lseek(fd, 0, SEEK_CUR); |
| 2745 | 2732 | /* align to even */ |
| 2746 | 2733 | size = (size + 1) & ~1; |
| @@ -2767,7 +2754,7 @@ ST_FUNC int tcc_load_archive(TCCState *s1, int fd) · 20 unmodified lines | ||
| 2767 | 2754 | is referenced by the user (so it should be added as DT_NEEDED in |
| 2768 | 2755 | the generated ELF file) */ |
| 2769 | 2756 | ST_FUNC int tcc_load_dll(TCCState *s1, int fd, const char *filename, int level) |
| 2770 | −{ | |
| 2757 | +{ | |
| 2771 | 2758 | ElfW(Ehdr) ehdr; |
| 2772 | 2759 | ElfW(Shdr) *shdr, *sh, *sh1; |
| 2773 | 2760 | int i, j, nb_syms, nb_dts, sym_bind, ret; |
| @@ -2776,7 +2763,7 @@ ST_FUNC int tcc_load_dll(TCCState *s1, int fd, const char *filename, int level) · 2 unmodified lines | ||
| 2776 | 2763 | unsigned char *dynstr; |
| 2777 | 2764 | const char *name, *soname; |
| 2778 | 2765 | DLLReference *dllref; |
| 2779 | − | |
| 2766 | + | |
| 2780 | 2767 | read(fd, &ehdr, sizeof(ehdr)); |
| 2781 | 2768 | |
| 2782 | 2769 | /* test CPU specific stuff */ |
| @@ -2811,10 +2798,10 @@ ST_FUNC int tcc_load_dll(TCCState *s1, int fd, const char *filename, int level) · 28 unmodified lines | ||
| 2811 | 2798 | break; |
| 2812 | 2799 | } |
| 2813 | 2800 | } |
| 2814 | − | |
| 2801 | + | |
| 2815 | 2802 | /* compute the real library name */ |
| 2816 | 2803 | soname = tcc_basename(filename); |
| 2817 | − | |
| 2804 | + | |
| 2818 | 2805 | for(i = 0, dt = dynamic; i < nb_dts; i++, dt++) { |
| 2819 | 2806 | if (dt->d_tag == DT_SONAME) { |
| 2820 | 2807 | soname = dynstr + dt->d_un.d_val; |
| @@ -2832,8 +2819,6 @@ ST_FUNC int tcc_load_dll(TCCState *s1, int fd, const char *filename, int level) · 11 unmodified lines | ||
| 2832 | 2819 | goto the_end; |
| 2833 | 2820 | } |
| 2834 | 2821 | } |
| 2835 | − | |
| 2836 | − // printf("loading dll '%s'\n", soname); | |
| 2837 | 2822 | |
| 2838 | 2823 | /* add the dll and its level */ |
| 2839 | 2824 | dllref = tcc_mallocz(sizeof(DLLReference) + strlen(soname)); |
| @@ -2993,11 +2978,6 @@ static int ld_next(TCCState *s1, char *name, int name_size) · 153 unmodified lines | ||
| 2993 | 2978 | inp(); |
| 2994 | 2979 | break; |
| 2995 | 2980 | } |
| 2996 | −#if 0 | |
| 2997 | − printf("tok=%c %d\n", c, c); | |
| 2998 | − if (c == LD_TOK_NAME) | |
| 2999 | − printf(" name=%s\n", name); | |
| 3000 | −#endif | |
| 3001 | 2981 | return c; |
| 3002 | 2982 | } |
| 3003 | 2983 | |
| @@ -3101,7 +3081,7 @@ ST_FUNC int tcc_load_ldscript(TCCState *s1) · 97 unmodified lines | ||
| 3101 | 3081 | char cmd[64]; |
| 3102 | 3082 | char filename[1024]; |
| 3103 | 3083 | int t, ret; |
| 3104 | − | |
| 3084 | + | |
| 3105 | 3085 | ch = file->buf_ptr[0]; |
| 3106 | 3086 | ch = handle_eob(); |
| 3107 | 3087 | for(;;) { |
| @@ -3136,4 +3116,4 @@ ST_FUNC int tcc_load_ldscript(TCCState *s1) · 28 unmodified lines | ||
| 3136 | 3116 | } |
| 3137 | 3117 | return 0; |
| 3138 | 3118 | } |
| 3139 | −#endif /* ndef TCC_TARGET_PE */ | |
| 3119 | +#endif /* !TCC_TARGET_PE */ | |