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;
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];
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);
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[];