+ int textrelLoc = headerSize;
+
+ // Add headers for relocated sections, if any...
+ if (sect[TEXT].relocs > 0)
+ headerSize += DepositELFSectionHeader(headers + headerSize, shstTab[ES_RELATEXT], 4, 0x00, 0, 0, 0, elfHdrNum[ES_SYMTAB], elfHdrNum[ES_TEXT], 4, 0x0C);
+
+ int datarelLoc = headerSize;
+
+ if (sect[DATA].relocs > 0)
+ headerSize += DepositELFSectionHeader(headers + headerSize, shstTab[ES_RELADATA], 4, 0x40, 0, 0, 0, elfHdrNum[ES_SYMTAB], elfHdrNum[ES_DATA], 4, 0x0C);
+
+ // Add shstrtab
+ headerSize += DepositELFSectionHeader(headers + headerSize, shstTab[ES_SHSTRTAB], 3, 0, 0, elfSize, shstSize, 0, 0, 1, 0);
+ memcpy(buf + elfSize, shstrtab, shstSize);
+ elfSize += shstSize;
+ // Pad for next section (LONG boundary)
+ elfSize = (elfSize + 3) & ~3;
+
+ // Add section headers
+ int headerLoc = elfSize;
+ chptr = buf + 0x20; // Set section header offset in ELF header
+ D_long(headerLoc);
+ elfSize += (4 * 10) * numEntries;
+
+ // Add symbol table & string table
+ int symtabLoc = elfSize;
+ strindx = 0; // Make sure we start at the beginning...
+ elfSize += DepositELFSymbol(buf + elfSize, 0, 0, 0, 0, 0, 0);
+ *strtable = 0;
+ strindx++;
+ extraSyms = 1;
+
+ if (sect[TEXT].sloc > 0)
+ {
+ elfSize += DepositELFSymbol(buf + elfSize, 0, 0, 0, 3, 0, elfHdrNum[ES_TEXT]);
+ extraSyms++;
+ }
+
+ if (sect[DATA].sloc > 0)
+ {
+ elfSize += DepositELFSymbol(buf + elfSize, 0, 0, 0, 3, 0, elfHdrNum[ES_DATA]);
+ extraSyms++;
+ }
+
+ if (sect[BSS].sloc > 0)
+ {
+ elfSize += DepositELFSymbol(buf + elfSize, 0, 0, 0, 3, 0, elfHdrNum[ES_BSS]);
+ extraSyms++;
+ }
+
+ int numSymbols = sy_assign_ELF(buf + elfSize, AddELFSymEntry);
+ elfSize += numSymbols * 0x10;
+
+ // String table
+ int strtabLoc = elfSize;
+ memcpy(buf + elfSize, strtable, strindx);
+ elfSize += strindx;
+ // Pad for next section (LONG boundary)
+ elfSize = (elfSize + 3) & ~3;
+
+ headerSize += DepositELFSectionHeader(headers + headerSize, shstTab[ES_SYMTAB], 2, 0, 0, symtabLoc, (numSymbols + extraSyms) * 0x10, shstIndex + 2, firstglobal + extraSyms, 4, 0x10);
+ headerSize += DepositELFSectionHeader(headers + headerSize, shstTab[ES_STRTAB], 3, 0, 0, strtabLoc, strindx, 0, 0, 1, 0);
+
+ // Add relocation tables, if any (no need to align after these, they're
+ // already on DWORD boundaries)
+ if (sect[TEXT].relocs > 0)
+ {
+ uint32_t textrelSize = CreateELFRelocationRecord(buf + elfSize, buf + textLoc, TEXT);
+ // Deposit offset & size, now that we know them
+ chptr = headers + textrelLoc + 0x10;
+ D_long(elfSize);
+ D_long(textrelSize);
+ elfSize += textrelSize;
+ }
+
+ if (sect[DATA].relocs > 0)
+ {
+ uint32_t datarelSize = CreateELFRelocationRecord(buf + elfSize, buf + dataLoc, DATA);
+ // Deposit offset & size, now that we know them
+ chptr = headers + datarelLoc + 0x10;
+ D_long(elfSize);
+ D_long(datarelSize);
+ elfSize += datarelSize;
+ }
+
+ // Copy headers into the object
+ memcpy(buf + headerLoc, headers, headerSize);
+
+ // Finally, write out the object
+ unused = write(fd, buf, elfSize);
+
+ // Free allocated memory
+ if (buf)
+ {
+ free(buf);
+ free(strtable);
+ }
+ }
+ else if (obj_format == XEX)
+ {
+ // Just write the object file
+ m6502obj(fd);