Add support for indirect functions as externals.

Add link support to use indirect functions defined in external modules
This commit is contained in:
Thomas Preud'homme
2010-06-24 20:53:42 +02:00
parent 82c5edb31c
commit bcc9137a10
3 changed files with 14 additions and 7 deletions

View File

@ -1514,9 +1514,10 @@ static int elf_output_file(TCCState *s1, const char *filename)
build_got(s1);
/* scan for undefined symbols and see if they are in the
dynamic symbols. If a symbol STT_FUNC is found, then we
add it in the PLT. If a symbol STT_OBJECT is found, we
add it in the .bss section with a suitable relocation */
dynamic symbols. If a symbol STT_FUNC or STT_GNU_IFUNC
is found, then we add it in the PLT. If a symbol
STT_OBJECT is found, we add it in the .bss section with
a suitable relocation */
sym_end = (ElfW(Sym) *)(symtab_section->data +
symtab_section->data_offset);
if (file_type == TCC_OUTPUT_EXE) {
@ -1529,7 +1530,7 @@ static int elf_output_file(TCCState *s1, const char *filename)
if (sym_index) {
esym = &((ElfW(Sym) *)s1->dynsymtab_section->data)[sym_index];
type = ELFW(ST_TYPE)(esym->st_info);
if (type == STT_FUNC) {
if ((type == STT_FUNC) || (type == STT_GNU_IFUNC)) {
put_got_entry(s1, R_JMP_SLOT, esym->st_size,
esym->st_info,
sym - (ElfW(Sym) *)symtab_section->data);
@ -1626,8 +1627,9 @@ static int elf_output_file(TCCState *s1, const char *filename)
sym++) {
if (ELFW(ST_BIND)(sym->st_info) != STB_LOCAL) {
#if defined(TCC_OUTPUT_DLL_WITH_PLT)
if (ELFW(ST_TYPE)(sym->st_info) == STT_FUNC &&
sym->st_shndx == SHN_UNDEF) {
if ((ELFW(ST_TYPE)(sym->st_info) == STT_FUNC ||
ELFW(ST_TYPE)(sym->st_info) == STT_GNU_IFUNC)
&& sym->st_shndx == SHN_UNDEF) {
put_got_entry(s1, R_JMP_SLOT, sym->st_size,
sym->st_info,
sym - (ElfW(Sym) *)symtab_section->data);