Skip to content
This repository was archived by the owner on Jun 23, 2026. It is now read-only.

Commit 93eaf03

Browse files
fix: wrong resolve_sym semantics
1 parent 2a3d144 commit 93eaf03

1 file changed

Lines changed: 8 additions & 3 deletions

File tree

src/ezld/linker.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -460,12 +460,18 @@ static size_t resolve_sym(Elf32_Sym *ret,
460460
ezld_obj_sym_t *objsym,
461461
size_t glob_stridx,
462462
bool use_sym_name) {
463+
Elf32_Sym dummy;
464+
if (ret == NULL) {
465+
ret = &dummy;
466+
}
467+
463468
if (objsym != NULL && objsym->osy_globndx != EZLD_GLOB_SYM_UNDEF) {
464469
*ret = g_self->i_globsymtab.buf[objsym->osy_globndx - 1];
465470
return objsym->osy_globndx;
466471
}
467472

468-
if (use_sym_name && objsym != NULL && objsym->osy_name != NULL) {
473+
if (use_sym_name && objsym != NULL) {
474+
assert(objsym->osy_name != NULL);
469475
glob_stridx = globstr_add(objsym->osy_name);
470476
}
471477

@@ -755,7 +761,7 @@ static void merge_symtabs(ezld_obj_t *obj) {
755761
}
756762

757763
size_t glob_strndx = globstr_add(obj_sym->osy_name);
758-
size_t glob_symndx = resolve_sym(NULL, NULL, glob_strndx, true);
764+
size_t glob_symndx = resolve_sym(NULL, obj_sym, glob_strndx, false);
759765
Elf32_Sym *glob_sym = NULL;
760766

761767
uint32_t glob_shidx = SHN_COMMON;
@@ -765,7 +771,6 @@ static void merge_symtabs(ezld_obj_t *obj) {
765771
glob_sym = &g_self->i_globsymtab.buf[glob_symndx - 1];
766772

767773
if (entry.st_shndx == SHN_COMMON) {
768-
obj_sym->osy_globndx = glob_symndx;
769774
// Global COMMON symbol shall have size and alignemtn (st_value)
770775
// equal to the largest declared in the various object files
771776
if (glob_sym->st_shndx == SHN_COMMON) {

0 commit comments

Comments
 (0)