X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=object.c;h=ada5337010c9f371de680c26ef317b6308654a82;hb=refs%2Ftags%2Fv2.1.9;hp=f100e4ae18fd1a95a8c9fc3e903231fd3c7f614a;hpb=bf4dbb2860116dd1d0fd934b28a16f9eb15cd7fd;p=rmac diff --git a/object.c b/object.c index f100e4a..ada5337 100644 --- a/object.c +++ b/object.c @@ -1,7 +1,7 @@ // -// 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-2019 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 // @@ -161,6 +161,24 @@ uint8_t * AddSymEntry(register uint8_t * buf, SYM * sym, int globflag) // // Add an entry to the BSD symbol table // +// From stab.def (https://sites.uclouvain.be/SystInfo/usr/include/bits/stab.def.html): +/* +_________________________________________________ +| 00 - 1F are not dbx stab symbols | +| In most cases, the low bit is the EXTernal bit| + +| 00 UNDEF | 02 ABS | 04 TEXT | 06 DATA | +| 01 |EXT | 03 |EXT | 05 |EXT | 07 |EXT | + +| 08 BSS | 0A INDR | 0C FN_SEQ | 0E WEAKA | +| 09 |EXT | 0B | 0D WEAKU | 0F WEAKT | + +| 10 WEAKD | 12 COMM | 14 SETA | 16 SETT | +| 11 WEAKB | 13 | 15 | 17 | + +| 18 SETD | 1A SETB | 1C SETV | 1E WARNING| +| 19 | 1B | 1D | 1F FN | +*/ uint8_t * AddBSDSymEntry(uint8_t * buf, SYM * sym, int globflag) { chptr = buf; // Point to buffer for depositing longs @@ -173,14 +191,16 @@ uint8_t * AddBSDSymEntry(uint8_t * buf, SYM * sym, int globflag) { 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) @@ -222,7 +242,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; @@ -230,7 +250,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]; @@ -238,8 +258,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); @@ -327,7 +352,9 @@ int WriteObject(int fd) // Write requested object file... if ((obj_format == BSD) || ((obj_format == ALCYON) && (prg_flag == 0))) - { + { + ch_size = 0; + // Force BSD format (if it was ALCYON format) obj_format = BSD; @@ -425,6 +452,8 @@ int WriteObject(int fd) } else if (obj_format == ALCYON) { + ch_size = 0; + if (verb_flag) { if (prg_flag) @@ -435,6 +464,7 @@ int WriteObject(int fd) // Assign index numbers to the symbols, get # of symbols (we assume // that all symbols can potentially be extended, hence the x28) + // (To clarify: 28 bytes is the size of an extended symbol) uint32_t symbolMaxSize = sy_assign(NULL, NULL) * 28; // Alloc memory for header + text + data, symbol and relocation @@ -807,13 +837,52 @@ for(int j=0; jchnext) + { + memcpy(p, cp->chptr, cp->ch_size); + p += cp->ch_size; + } + } + + if (MarkABSImage(buf, tds, sect[TEXT].sloc, TEXT) != OK) // Do TEXT relocation table + { + return ERROR; + } + if (MarkABSImage(buf, tds, sect[TEXT].sloc, DATA) != OK) // Do DATA relocation table + { + return ERROR; + } + + // Write out the header + text & data + symbol table (if any) + unused = write(fd, buf, tds); + + } return 0; }