From 2024c445411f80b7c4b761322521d823e606418d Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Fri, 4 Apr 2014 17:54:52 +0200 Subject: [PATCH] run: Always create .got relocs When output is memory we applied the correct GOT offset for certain relocations (e.g. _GOT32), but we forgot to actually fill the got entries with the final symbol values, so unconditionally create relocs against .got as well. --- tccelf.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tccelf.c b/tccelf.c index f92021c..568b40f 100644 --- a/tccelf.c +++ b/tccelf.c @@ -1173,6 +1173,13 @@ static unsigned long put_got_entry(TCCState *s1, put_elf_reloc(s1->dynsym, s1->got, s1->got->data_offset, reloc_type, index); + } else { + /* Without .dynsym (i.e. static link or memory output) we + still need relocs against the generated got, so as to fill + the entries with the symbol values (determined later). */ + put_elf_reloc(symtab_section, s1->got, + s1->got->data_offset, + reloc_type, sym_index); } /* And now create the GOT slot itself. */ ptr = section_ptr_add(s1->got, PTR_SIZE);