aboutsummaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorAndrew Chambers <[email protected]>2021-10-09 12:26:04 +1300
committerAndrew Chambers <[email protected]>2021-10-09 12:26:04 +1300
commit7d4d40816e2e78ba5a413344502ded03b68aae7d (patch)
tree293cb4f00954d8296d6227c79157ed9f11eb1257 /main.c
parent08716714c914e696ffbd1410fa7f16a0bc18ad1c (diff)
Fix global symbol binding.
Diffstat (limited to 'main.c')
-rw-r--r--main.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/main.c b/main.c
index 28e0e45..2e2f1a0 100644
--- a/main.c
+++ b/main.c
@@ -667,14 +667,14 @@ static void addtosymtab(Symbol *sym) {
sbind = sym->global ? STB_GLOBAL : STB_LOCAL;
} else {
stype = 0;
- sbind = 0;
+ sbind = STB_GLOBAL;
}
memset(&elfsym, 0, sizeof(elfsym));
elfsym.st_name = elfstr(strtab, sym->name);
elfsym.st_size = sym->size;
elfsym.st_value = sym->offset;
- elfsym.st_info = ELF32_ST_BIND(sbind) | ELF32_ST_TYPE(stype);
+ elfsym.st_info = ELF64_ST_INFO(sbind, stype);
elfsym.st_shndx = sym->section ? sym->section->idx : SHN_UNDEF;
secaddbytes(symtab, (uint8_t *)&elfsym, sizeof(Elf64_Sym));
}
@@ -683,12 +683,23 @@ static void fillsymtab(void) {
Symbol *sym;
size_t i;
+ // Local symbols
+ for (i = 0; i < symbols->cap; i++) {
+ if (!symbols->keys[i].str)
+ continue;
+ sym = symbols->vals[i];
+ if (!sym->defined || sym->global)
+ continue;
+ addtosymtab(sym);
+ }
+
// Global symbols
for (i = 0; i < symbols->cap; i++) {
if (!symbols->keys[i].str)
continue;
sym = symbols->vals[i];
- if (!sym->global && sym->defined)
+
+ if (sym->defined && !sym->global)
continue;
addtosymtab(sym);
}