summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2019-06-08 13:28:08 -0400
committerBen Gamari <ben@smart-cactus.org>2019-06-12 08:45:15 -0400
commite628c7be84ba59c947d51053599831c7df9a5492 (patch)
tree7d88d5d855acc9180f7f1af7aa15b83e514de4fd
parent5e6f261aee196eb5984d192dcb01710b070452b3 (diff)
downloadhaskell-e628c7be84ba59c947d51053599831c7df9a5492.tar.gz
rts/linker: Make elf_got.c a bit more legible
(cherry picked from commit bbc752c50f3adcb659cd8447635828e137a0a314)
-rw-r--r--rts/linker/elf_got.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/rts/linker/elf_got.c b/rts/linker/elf_got.c
index 10ea25b98b..ee73a4a4da 100644
--- a/rts/linker/elf_got.c
+++ b/rts/linker/elf_got.c
@@ -52,11 +52,13 @@ makeGot(ObjectCode * oc) {
errorBelch("MAP_FAILED. errno=%d", errno);
return EXIT_FAILURE;
}
+
oc->info->got_start = (void*)mem;
/* update got_addr */
size_t slot = 0;
for(ElfSymbolTable *symTab = oc->info->symbolTables;
- symTab != NULL; symTab = symTab->next)
+ symTab != NULL; symTab = symTab->next) {
+
for(size_t i=0; i < symTab->n_symbols; i++)
if(needGotSlot(symTab->symbols[i].elf_sym))
symTab->symbols[i].got_addr
@@ -74,9 +76,12 @@ fillGot(ObjectCode * oc) {
/* fill the GOT table */
for(ElfSymbolTable *symTab = oc->info->symbolTables;
symTab != NULL; symTab = symTab->next) {
+
for(size_t i=0; i < symTab->n_symbols; i++) {
ElfSymbol * symbol = &symTab->symbols[i];
+
if(needGotSlot(symbol->elf_sym)) {
+
/* no type are undefined symbols */
if( STT_NOTYPE == ELF_ST_TYPE(symbol->elf_sym->st_info)
|| STB_WEAK == ELF_ST_BIND(symbol->elf_sym->st_info)) {
@@ -93,22 +98,26 @@ fillGot(ObjectCode * oc) {
} /* else it was defined somewhere in the same object, and
* we should have the address already.
*/
+
if(0x0 == symbol->addr) {
errorBelch(
"Something went wrong! Symbol %s has null address.\n",
symbol->name);
return EXIT_FAILURE;
}
+
if(0x0 == symbol->got_addr) {
errorBelch("Not good either!");
return EXIT_FAILURE;
}
+
*(void**)symbol->got_addr = symbol->addr;
}
}
}
return EXIT_SUCCESS;
}
+
bool
verifyGot(ObjectCode * oc) {
for(ElfSymbolTable *symTab = oc->info->symbolTables;