Mercurial > hg > qcc
changeset 272:ad577f436eb7
[project @ 2003-05-24 15:46:29 by bellard]
added -rdynamic support
author | bellard |
---|---|
date | Sat, 24 May 2003 15:46:29 +0000 |
parents | 78bb1275200d |
children | cb72fe14a384 |
files | tcc.c tccelf.c |
diffstat | 2 files changed, 19 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/tcc.c Sat May 24 15:45:33 2003 +0000 +++ b/tcc.c Sat May 24 15:46:29 2003 +0000 @@ -398,6 +398,9 @@ /* if true, static linking is performed */ int static_link; + /* if true, all symbols are exported */ + int rdynamic; + /* if true, only link in referenced objects from archive */ int alacarte_link; @@ -9653,7 +9656,7 @@ { "shared", TCC_OPTION_shared, 0 }, { "o", TCC_OPTION_o, TCC_OPTION_HAS_ARG }, { "run", TCC_OPTION_run, 0 }, - { "rdynamic", TCC_OPTION_rdynamic, 0 }, /* currently ignored */ + { "rdynamic", TCC_OPTION_rdynamic, 0 }, { "r", TCC_OPTION_r, 0 }, { "W", TCC_OPTION_W, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP }, { "O", TCC_OPTION_O, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP }, @@ -9838,6 +9841,9 @@ goto unsupported_option; } break; + case TCC_OPTION_rdynamic: + s->rdynamic = 1; + break; default: if (s->warn_unsupported) { unsupported_option:
--- a/tccelf.c Sat May 24 15:45:33 2003 +0000 +++ b/tccelf.c Sat May 24 15:46:29 2003 +0000 @@ -779,7 +779,7 @@ Section *s; if (!s1->nostdlib) { - snprintf(buf, sizeof(buf), "%s/%s", tcc_lib_path, "libtcc1.o"); + snprintf(buf, sizeof(buf), "%s/%s", tcc_lib_path, "libtcc1.a"); tcc_add_file(s1, buf); } #ifdef CONFIG_TCC_BCHECK @@ -967,7 +967,7 @@ unsigned long offset; offset = bss_section->data_offset; /* XXX: which alignment ? */ - offset = (offset + 8 - 1) & -8; + offset = (offset + 16 - 1) & -16; index = put_elf_sym(s1->dynsym, offset, esym->st_size, esym->st_info, 0, bss_section->sh_num, name); @@ -986,6 +986,14 @@ error_noabort("undefined symbol '%s'", name); } } + } else if (s1->rdynamic && + ELF32_ST_BIND(sym->st_info) != STB_LOCAL) { + /* if -rdynamic option, then export all non + local symbols */ + name = symtab_section->link->data + sym->st_name; + put_elf_sym(s1->dynsym, sym->st_value, sym->st_size, + sym->st_info, 0, + sym->st_shndx, name); } } @@ -1003,6 +1011,8 @@ name = s1->dynsymtab_section->link->data + esym->st_name; sym_index = find_elf_sym(symtab_section, name); if (sym_index) { + /* XXX: avoid adding a symbol if already + present because of -rdynamic ? */ sym = &((Elf32_Sym *)symtab_section->data)[sym_index]; put_elf_sym(s1->dynsym, sym->st_value, sym->st_size, sym->st_info, 0,