Recognize -Wl,-Bsymbolic

Without -Bsymbolic, a symbol/function in a *.so can be overridden
by a symbol/function in the main module.
That is the default search order, but not supported by tcc.

With -Bsymbolic, the linker tries to resolve a symbol/function in
the current module first.
The loader in tcc implements this search order.

We do not distinguish -Bsymbolic and -Bsymbolic-function

--
By by ... Detlef
master
Detlef Riekenberg 2010-01-26 22:55:14 +01:00 committed by Detlef Riekenberg
parent 5caf6235cf
commit 2650584ac4
3 changed files with 9 additions and 0 deletions

2
tcc.c
View File

@ -386,6 +386,8 @@ static int parse_args(TCCState *s, int argc, char **argv)
if (strstart(optarg, "-Ttext,", &p)) {
s->text_addr = strtoul(p, NULL, 16);
s->has_text_addr = 1;
} else if (strstart(optarg, "-Bsymbolic", &p)) {
s->symbolic = TRUE;
} else if (strstart(optarg, "--section-alignment,", &p)) {
s->section_align = strtoul(p, NULL, 16);
} else if (strstart(optarg, "--image-base,", &p)) {

3
tcc.h
View File

@ -445,6 +445,9 @@ struct TCCState {
/* if true, all symbols are exported */
int rdynamic;
/* if true, resolve symbols in the current module first (-Wl,Bsymbolic) */
int symbolic;
/* if true, only link in referenced objects from archive */
int alacarte_link;

View File

@ -1575,6 +1575,10 @@ static int elf_output_file(TCCState *s1, const char *filename)
put_dt(dynamic, DT_SONAME, put_elf_str(dynstr, s1->soname));
put_dt(dynamic, DT_TEXTREL, 0);
}
if (s1->symbolic)
put_dt(dynamic, DT_SYMBOLIC, 0);
/* add necessary space for other entries */
saved_dynamic_data_offset = dynamic->data_offset;
dynamic->data_offset += sizeof(ElfW(Dyn)) * EXTRA_RELITEMS;