//
-// RMAC - Reboot's Macro Assembler for all Atari computers
+// RMAC - Renamed Macro Assembler for all Atari computers
// OBJECT.C - Writing Object Files
-// Copyright (C) 199x Landon Dyer, 2011-2020 Reboot and Friends
+// Copyright (C) 199x Landon Dyer, 2011-2021 Reboot and Friends
// RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
// Source utilised with the kind permission of Landon Dyer
//
{
z = 0x02000000; // Set equated flag
}
- else
+
+ // If a symbol is both EQUd and flagged as TBD then we let
+ // the later take precedence. Otherwise the linker will not even
+ // bother trying to relocate the address during link time
+
+ switch (w1 & TDB)
{
- switch (w1 & TDB)
- {
- case TEXT: z = 0x04000000; break; // Set TEXT segment flag
- case DATA: z = 0x06000000; break; // Set DATA segment flag
- case BSS : z = 0x08000000; break; // Set BSS segment flag
- }
+ case TEXT: z = 0x04000000; break; // Set TEXT segment flag
+ case DATA: z = 0x06000000; break; // Set DATA segment flag
+ case BSS : z = 0x08000000; break; // Set BSS segment flag
}
if (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;
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);