From: ggn Date: Sat, 8 Aug 2020 14:17:56 +0000 (+0300) Subject: Fix for bug #170 - ELF output module exports global,defined symbols as undefined X-Git-Tag: v2.1.0~5 X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=commitdiff_plain;h=ceab9325bdbffccecf61ba26387ed03f4ab0591e Fix for bug #170 - ELF output module exports global,defined symbols as undefined Signed-off-by: ggn --- diff --git a/object.c b/object.c index 0b7df7e..fe10743 100644 --- a/object.c +++ b/object.c @@ -224,7 +224,7 @@ uint8_t * AddELFSymEntry(uint8_t * buf, SYM * sym, int globflag) if (w1 & DEFINED) { if (globflag) // Export the symbol - st_info |= 16; //STB_GLOBAL (1<<4) + st_info |= 16; // STB_GLOBAL (1<<4) } else if (w1 & (GLOBAL | REFERENCED)) st_info |= 16; @@ -232,7 +232,7 @@ uint8_t * AddELFSymEntry(uint8_t * buf, SYM * sym, int globflag) D_byte(st_info); D_byte(0); // st_other - uint16_t st_shndx = 0xFFF1; // Assume absolute (equated) number + uint16_t st_shndx = SHN_ABS; // Assume absolute (equated) number if (w1 & TEXT) st_shndx = elfHdrNum[ES_TEXT]; @@ -240,8 +240,13 @@ uint8_t * AddELFSymEntry(uint8_t * buf, SYM * sym, int globflag) st_shndx = elfHdrNum[ES_DATA]; else if (w1 & BSS) st_shndx = elfHdrNum[ES_BSS]; - else if (globflag) - st_shndx = 0; // Global, not absolute + else if (globflag && !(w1 & DEFINED) && (w1 & REFERENCED)) + { + st_shndx = SHN_UNDEF; + } // If the symbol is global then probably we + // don't need to do anything (probably) + // since we set STB_GLOBAL in st_info above. + // Unless we need to set it to SHN_COMMON? D_word(st_shndx); diff --git a/object.h b/object.h index f871457..fe5997c 100644 --- a/object.h +++ b/object.h @@ -33,6 +33,14 @@ enum ELFSectionNames ES_SYMTAB, ES_STRTAB }; +// +// ELF special section indices (field st_shndx) +// Lifted from glibc (https://sourceware.org/git/?p=glibc.git;a=blob;f=elf/elf.h) +// +#define SHN_UNDEF 0 /* Undefined section */ +#define SHN_ABS 0xFFF1 /* Associated symbol is absolute */ +#define SHN_COMMON 0xFFF2 /* Associated symbol is common */ + // Exported variables. extern uint8_t * objImage; extern int elfHdrNum[];