diff options
| author | bellard <bellard> | 2003-05-29 22:52:53 +0000 |
|---|---|---|
| committer | bellard <bellard> | 2003-05-29 22:52:53 +0000 |
| commit | 9d95be78c8c5b43694397290525fb9cb689ecd53 (patch) | |
| tree | ec87b90d13ad8fa681b46e63c1af6d070ac44488 | |
| parent | 370f5e571c4cebe66275c33b4115282930bad544 (diff) | |
| download | tinycc-9d95be78c8c5b43694397290525fb9cb689ecd53.tar.gz tinycc-9d95be78c8c5b43694397290525fb9cb689ecd53.tar.bz2 | |
added init_array defines for new ld compatibility
| -rw-r--r-- | tccelf.c | 33 |
1 files changed, 33 insertions, 0 deletions
@@ -771,6 +771,34 @@ static void put_dt(Section *dynamic, int dt, unsigned long val) dyn->d_un.d_val = val; } +static void add_init_array_defines(TCCState *s1, const char *section_name) +{ + Section *s; + long end_offset; + char sym_start[1024]; + char sym_end[1024]; + + snprintf(sym_start, sizeof(sym_start), "__%s_start", section_name + 1); + snprintf(sym_end, sizeof(sym_end), "__%s_end", section_name + 1); + + s = find_section(s1, section_name); + if (!s) { + end_offset = 0; + s = data_section; + } else { + end_offset = s->data_offset; + } + + add_elf_sym(symtab_section, + 0, 0, + ELF32_ST_INFO(STB_GLOBAL, STT_NOTYPE), + s->sh_num, sym_start); + add_elf_sym(symtab_section, + end_offset, 0, + ELF32_ST_INFO(STB_GLOBAL, STT_NOTYPE), + s->sh_num, sym_end); +} + /* add tcc runtime libraries */ static void tcc_add_runtime(TCCState *s1) { @@ -830,6 +858,11 @@ static void tcc_add_runtime(TCCState *s1) bss_section->data_offset, 0, ELF32_ST_INFO(STB_GLOBAL, STT_NOTYPE), bss_section->sh_num, "_end"); + /* horrible new standard ldscript defines */ + add_init_array_defines(s1, ".preinit_array"); + add_init_array_defines(s1, ".init_array"); + add_init_array_defines(s1, ".fini_array"); + /* add start and stop symbols for sections whose name can be expressed in C */ for(i = 1; i < s1->nb_sections; i++) { |
