History

Revert "Add macro to browse reloc and sym entries"

This reverts commit 3cbc7a2dccf13b96c572623582d6c54394f98c36.

Thomas Preud'homme committed 12 years ago

Commit 2eb844f1 parent e5a706a1 file · +77 −37Browse files

Unified · Split

tccelf.c+77−37
@@ -330,12 +330,6 @@ ST_FUNC void put_stabd(int type, int other, int desc) · 329 unmodified lines
330330 put_stabs(NULL, type, other, desc, 0);
331331 }
332332
333−/* Browse each elem of type <type> in section <sec> starting at elem <startoff>
334− using variable <elem> */
335−#define for_each_elem(sec, startoff, elem, type) \
336− for (elem = (type *) sec->data + startoff; \
337− elem < (type *) (sec->data + sec->data_offset); elem++)
338−
339333 /* In an ELF file symbol table, the local symbols must appear below
340334 the global and weak ones. Since TCC cannot sort it while generating
341335 the code, we must do it after. All the relocation tables are also
@@ -346,7 +340,7 @@ static void sort_syms(TCCState *s1, Section *s) · 4 unmodified lines
346340 ElfW(Sym) *new_syms;
347341 int nb_syms, i;
348342 ElfW(Sym) *p, *q;
349− ElfW_Rel *rel;
343+ ElfW_Rel *rel, *rel_end;
350344 Section *sr;
351345 int type, sym_index;
352346
@@ -385,7 +379,10 @@ static void sort_syms(TCCState *s1, Section *s) · 32 unmodified lines
385379 for(i = 1; i < s1->nb_sections; i++) {
386380 sr = s1->sections[i];
387381 if (sr->sh_type == SHT_RELX && sr->link == s) {
388− for_each_elem(sr, 0, rel, ElfW_Rel) {
382+ rel_end = (ElfW_Rel *)(sr->data + sr->data_offset);
383+ for(rel = (ElfW_Rel *)sr->data;
384+ rel < rel_end;
385+ rel++) {
389386 sym_index = ELFW(R_SYM)(rel->r_info);
390387 type = ELFW(R_TYPE)(rel->r_info);
391388 sym_index = old_to_new_syms[sym_index];
@@ -400,10 +397,13 @@ static void sort_syms(TCCState *s1, Section *s) · 8 unmodified lines
400397 /* relocate common symbols in the .bss section */
401398 ST_FUNC void relocate_common_syms(void)
402399 {
403− ElfW(Sym) *sym;
400+ ElfW(Sym) *sym, *sym_end;
404401 unsigned long offset, align;
405−
406− for_each_elem(symtab_section, 1, sym, ElfW(Sym)) {
402+
403+ sym_end = (ElfW(Sym) *)(symtab_section->data + symtab_section->data_offset);
404+ for(sym = (ElfW(Sym) *)symtab_section->data + 1;
405+ sym < sym_end;
406+ sym++) {
407407 if (sym->st_shndx == SHN_COMMON) {
408408 /* align symbol */
409409 align = sym->st_value;
@@ -421,11 +421,14 @@ ST_FUNC void relocate_common_syms(void) · 11 unmodified lines
421421 true and output error if undefined symbol. */
422422 ST_FUNC void relocate_syms(TCCState *s1, int do_resolve)
423423 {
424− ElfW(Sym) *sym, *esym;
424+ ElfW(Sym) *sym, *esym, *sym_end;
425425 int sym_bind, sh_num, sym_index;
426426 const char *name;
427427
428− for_each_elem(symtab_section, 1, sym, ElfW(Sym)) {
428+ sym_end = (ElfW(Sym) *)(symtab_section->data + symtab_section->data_offset);
429+ for(sym = (ElfW(Sym) *)symtab_section->data + 1;
430+ sym < sym_end;
431+ sym++) {
429432 sh_num = sym->st_shndx;
430433 if (sh_num == SHN_UNDEF) {
431434 name = strtab_section->data + sym->st_name;
@@ -508,7 +511,7 @@ static addr_t add_jmp_table(TCCState *s1, int val) · 76 unmodified lines
508511 ST_FUNC void relocate_section(TCCState *s1, Section *s)
509512 {
510513 Section *sr;
511− ElfW_Rel *rel;
514+ ElfW_Rel *rel, *rel_end, *qrel;
512515 ElfW(Sym) *sym;
513516 int type, sym_index;
514517 unsigned char *ptr;
@@ -518,7 +521,11 @@ ST_FUNC void relocate_section(TCCState *s1, Section *s) · 3 unmodified lines
518521 #endif
519522
520523 sr = s->reloc;
521− for_each_elem(sr, 0, rel, ElfW_Rel) {
524+ rel_end = (ElfW_Rel *)(sr->data + sr->data_offset);
525+ qrel = (ElfW_Rel *)sr->data;
526+ for(rel = qrel;
527+ rel < rel_end;
528+ rel++) {
522529 ptr = s->data + rel->r_offset;
523530
524531 sym_index = ELFW(R_SYM)(rel->r_info);
@@ -886,22 +893,27 @@ ST_FUNC void relocate_section(TCCState *s1, Section *s) · 361 unmodified lines
886893 static void relocate_rel(TCCState *s1, Section *sr)
887894 {
888895 Section *s;
889− ElfW_Rel *rel;
890−
896+ ElfW_Rel *rel, *rel_end;
897+
891898 s = s1->sections[sr->sh_info];
892− for_each_elem(sr, 0, rel, ElfW_Rel)
899+ rel_end = (ElfW_Rel *)(sr->data + sr->data_offset);
900+ for(rel = (ElfW_Rel *)sr->data;
901+ rel < rel_end;
902+ rel++) {
893903 rel->r_offset += s->sh_addr;
904+ }
894905 }
895906
896907 /* count the number of dynamic relocations so that we can reserve
897908 their space */
898909 static int prepare_dynamic_rel(TCCState *s1, Section *sr)
899910 {
900− ElfW_Rel *rel;
911+ ElfW_Rel *rel, *rel_end;
901912 int sym_index, esym_index, type, count;
902913
903914 count = 0;
904− for_each_elem(sr, 0, rel, ElfW_Rel) {
915+ rel_end = (ElfW_Rel *)(sr->data + sr->data_offset);
916+ for(rel = (ElfW_Rel *)sr->data; rel < rel_end; rel++) {
905917 sym_index = ELFW(R_SYM)(rel->r_info);
906918 type = ELFW(R_TYPE)(rel->r_info);
907919 switch(type) {
@@ -1133,7 +1145,7 @@ static void put_got_entry(TCCState *s1, · 225 unmodified lines
11331145 ST_FUNC void build_got_entries(TCCState *s1)
11341146 {
11351147 Section *s;
1136− ElfW_Rel *rel;
1148+ ElfW_Rel *rel, *rel_end;
11371149 ElfW(Sym) *sym;
11381150 int i, type, reloc_type, sym_index;
11391151
@@ -1144,7 +1156,10 @@ ST_FUNC void build_got_entries(TCCState *s1) · 4 unmodified lines
11441156 /* no need to handle got relocations */
11451157 if (s->link != symtab_section)
11461158 continue;
1147− for_each_elem(s, 0, rel, ElfW_Rel) {
1159+ rel_end = (ElfW_Rel *)(s->data + s->data_offset);
1160+ for(rel = (ElfW_Rel *)s->data;
1161+ rel < rel_end;
1162+ rel++) {
11481163 type = ELFW(R_TYPE)(rel->r_info);
11491164 switch(type) {
11501165 #if defined(TCC_TARGET_I386)
@@ -1451,11 +1466,12 @@ static void tcc_output_binary(TCCState *s1, FILE *f, · 300 unmodified lines
14511466 void patch_dynsym_undef(TCCState *s1, Section *s)
14521467 {
14531468 uint32_t *gotd = (void *)s1->got->data;
1454− ElfW(Sym) *sym;
1469+ ElfW(Sym) *sym, *sym_end;
14551470
14561471 gotd += 3; /* dummy entries in .got */
14571472 /* relocate symbols in .dynsym */
1458− for_each_elem(s, 1, sym, ElfW(Sym)) {
1473+ sym_end = (ElfW(Sym) *)(s->data + s->data_offset);
1474+ for (sym = (ElfW(Sym) *)s->data + 1; sym < sym_end; sym++) {
14591475 if (sym->st_shndx == SHN_UNDEF) {
14601476 *gotd++ = sym->st_value + 6; /* XXX 6 is magic ? */
14611477 sym->st_value = 0;
@@ -1469,9 +1485,10 @@ void patch_dynsym_undef(TCCState *s1, Section *s) · 7 unmodified lines
14691485 /* zero plt offsets of weak symbols in .dynsym */
14701486 void patch_dynsym_undef(TCCState *s1, Section *s)
14711487 {
1472− ElfW(Sym) *sym;
1488+ ElfW(Sym) *sym, *sym_end;
14731489
1474− for_each_elem(s, 1, sym, ElfW(Sym))
1490+ sym_end = (ElfW(Sym) *)(s->data + s->data_offset);
1491+ for (sym = (ElfW(Sym) *)s->data + 1; sym < sym_end; sym++)
14751492 if (sym->st_shndx == SHN_UNDEF && ELFW(ST_BIND)(sym->st_info) == STB_WEAK)
14761493 sym->st_value = 0;
14771494 }
@@ -1497,7 +1514,7 @@ ST_FUNC void fill_got_entry(TCCState *s1, ElfW_Rel *rel) · 19 unmodified lines
14971514 ST_FUNC void fill_got(TCCState *s1)
14981515 {
14991516 Section *s;
1500− ElfW_Rel *rel;
1517+ ElfW_Rel *rel, *rel_end;
15011518 int i;
15021519
15031520 for(i = 1; i < s1->nb_sections; i++) {
@@ -1507,7 +1524,8 @@ ST_FUNC void fill_got(TCCState *s1) · 3 unmodified lines
15071524 /* no need to handle got relocations */
15081525 if (s->link != symtab_section)
15091526 continue;
1510− for_each_elem(s, 0, rel, ElfW_Rel) {
1527+ rel_end = (ElfW_Rel *) (s->data + s->data_offset);
1528+ for(rel = (ElfW_Rel *) s->data; rel < rel_end; rel++) {
15111529 switch (ELFW(R_TYPE) (rel->r_info)) {
15121530 case R_X86_64_GOT32:
15131531 case R_X86_64_GOTPCREL:
@@ -1565,7 +1583,7 @@ static int elf_output_file(TCCState *s1, const char *filename) · 51 unmodified lines
15651583 if (!s1->static_link) {
15661584 const char *name;
15671585 int sym_index, index;
1568− ElfW(Sym) *esym;
1586+ ElfW(Sym) *esym, *sym_end;
15691587
15701588 if (file_type == TCC_OUTPUT_EXE) {
15711589 char *ptr;
@@ -1604,8 +1622,12 @@ static int elf_output_file(TCCState *s1, const char *filename) · 32 unmodified lines
16041622 is found, then we add it in the PLT. If a symbol
16051623 STT_OBJECT is found, we add it in the .bss section with
16061624 a suitable relocation */
1625+ sym_end = (ElfW(Sym) *)(symtab_section->data +
1626+ symtab_section->data_offset);
16071627 if (file_type == TCC_OUTPUT_EXE) {
1608− for_each_elem(symtab_section, 1, sym, ElfW(Sym)) {
1628+ for(sym = (ElfW(Sym) *)symtab_section->data + 1;
1629+ sym < sym_end;
1630+ sym++) {
16091631 if (sym->st_shndx == SHN_UNDEF) {
16101632 name = symtab_section->link->data + sym->st_name;
16111633 sym_index = find_elf_sym(s1->dynsymtab_section, name);
@@ -1626,7 +1648,7 @@ static int elf_output_file(TCCState *s1, const char *filename) · 14 unmodified lines
16261648 sym - (ElfW(Sym) *)symtab_section->data);
16271649 } else if (type == STT_OBJECT) {
16281650 unsigned long offset;
1629− ElfW(Sym) *dynsym;
1651+ ElfW(Sym) *dynsym, *dynsym_end;
16301652 offset = bss_section->data_offset;
16311653 /* XXX: which alignment ? */
16321654 offset = (offset + 16 - 1) & -16;
@@ -1635,7 +1657,11 @@ static int elf_output_file(TCCState *s1, const char *filename) · 2 unmodified lines
16351657 bss_section->sh_num, name);
16361658 /* Ensure R_COPY works for weak symbol aliases */
16371659 if (ELFW(ST_BIND)(esym->st_info) == STB_WEAK) {
1638− for_each_elem(s1->dynsymtab_section, 1, dynsym, ElfW(Sym)) {
1660+ dynsym_end = (ElfW(Sym) *)
1661+ (s1->dynsymtab_section->data +
1662+ s1->dynsymtab_section->data_offset);
1663+ for(dynsym = (ElfW(Sym) *)s1->dynsymtab_section->data + 1;
1664+ dynsym < dynsym_end; dynsym++) {
16391665 if ((dynsym->st_value == esym->st_value)
16401666 && (ELFW(ST_BIND)(dynsym->st_info) == STB_GLOBAL)) {
16411667 char *dynname;
@@ -1681,7 +1707,11 @@ static int elf_output_file(TCCState *s1, const char *filename) · 39 unmodified lines
16811707
16821708 /* now look at unresolved dynamic symbols and export
16831709 corresponding symbol */
1684− for_each_elem(s1->dynsymtab_section, 1, esym, ElfW(Sym)) {
1710+ sym_end = (ElfW(Sym) *)(s1->dynsymtab_section->data +
1711+ s1->dynsymtab_section->data_offset);
1712+ for(esym = (ElfW(Sym) *)s1->dynsymtab_section->data + 1;
1713+ esym < sym_end;
1714+ esym++) {
16851715 if (esym->st_shndx == SHN_UNDEF) {
16861716 name = s1->dynsymtab_section->link->data + esym->st_name;
16871717 sym_index = find_elf_sym(symtab_section, name);
@@ -1706,7 +1736,9 @@ static int elf_output_file(TCCState *s1, const char *filename) · 18 unmodified lines
17061736 /* shared library case : we simply export all the global symbols */
17071737 nb_syms = symtab_section->data_offset / sizeof(ElfW(Sym));
17081738 s1->symtab_to_dynsym = tcc_mallocz(sizeof(int) * nb_syms);
1709− for_each_elem(symtab_section, 1, sym, ElfW(Sym)) {
1739+ for(sym = (ElfW(Sym) *)symtab_section->data + 1;
1740+ sym < sym_end;
1741+ sym++) {
17101742 if (ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) {
17111743 #if defined(TCC_OUTPUT_DLL_WITH_PLT)
17121744 if ((ELFW(ST_TYPE)(sym->st_info) == STT_FUNC ||
@@ -1995,6 +2027,8 @@ static int elf_output_file(TCCState *s1, const char *filename) · 282 unmodified lines
19952027
19962028 /* if dynamic section, then add corresponing program header */
19972029 if (dynamic) {
2030+ ElfW(Sym) *sym_end;
2031+
19982032 ph = &phdr[phnum - 1];
19992033
20002034 ph->p_type = PT_DYNAMIC;
@@ -2056,7 +2090,10 @@ static int elf_output_file(TCCState *s1, const char *filename) · 55 unmodified lines
20562090 }
20572091
20582092 /* relocate symbols in .dynsym */
2059− for_each_elem(s1->dynsym, 1, sym, ElfW(Sym)) {
2093+ sym_end = (ElfW(Sym) *)(s1->dynsym->data + s1->dynsym->data_offset);
2094+ for(sym = (ElfW(Sym) *)s1->dynsym->data + 1;
2095+ sym < sym_end;
2096+ sym++) {
20602097 if (sym->st_shndx == SHN_UNDEF) {
20612098 /* relocate to the PLT if the symbol corresponds
20622099 to a PLT entry */
@@ -2328,7 +2365,7 @@ ST_FUNC int tcc_load_object_file(TCCState *s1, · 265 unmodified lines
23282365 char *sh_name, *name;
23292366 SectionMergeInfo *sm_table, *sm;
23302367 ElfW(Sym) *sym, *symtab;
2331− ElfW_Rel *rel;
2368+ ElfW_Rel *rel, *rel_end;
23322369 Section *s;
23332370
23342371 int stab_index;
@@ -2548,7 +2585,10 @@ ST_FUNC int tcc_load_object_file(TCCState *s1, · 213 unmodified lines
25482585 case SHT_RELX:
25492586 /* take relocation offset information */
25502587 offseti = sm_table[sh->sh_info].offset;
2551− for_each_elem(s, (offset / sizeof(*rel)), rel, ElfW_Rel) {
2588+ rel_end = (ElfW_Rel *)(s->data + s->data_offset);
2589+ for(rel = (ElfW_Rel *)(s->data + offset);
2590+ rel < rel_end;
2591+ rel++) {
25522592 int type;
25532593 unsigned sym_index;
25542594 /* convert symbol index */

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t