summaryrefslogtreecommitdiffhomepage
path: root/Sources
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-04-25 08:17:31 +0200
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-04-25 08:17:31 +0200
commit56a3ee5b0485b04a41a01e3d2aee1d20f4bb2396 (patch)
tree67a063136dc1484230f8541ff9cf2accd23f3ab7 /Sources
parente6b847ddc2c3d936106e37e529f708654f46d6dc (diff)
linker: fix: Fix linker offsets when writing PEF.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'Sources')
-rw-r--r--Sources/coff2ae.cc2
-rw-r--r--Sources/link.cc57
2 files changed, 38 insertions, 21 deletions
diff --git a/Sources/coff2ae.cc b/Sources/coff2ae.cc
index 51f63c9..952be69 100644
--- a/Sources/coff2ae.cc
+++ b/Sources/coff2ae.cc
@@ -15,7 +15,7 @@
/////////////////////////////////////////////////////////////////////////////////////////
-/// @brief COFF 2 AE entrypoint, the program/module starts here.
+/// @brief COFF To AE entrypoint, the program/module starts here.
/////////////////////////////////////////////////////////////////////////////////////////
diff --git a/Sources/link.cc b/Sources/link.cc
index 5027a9f..03d07f3 100644
--- a/Sources/link.cc
+++ b/Sources/link.cc
@@ -12,7 +12,7 @@
/// @author Amlal El Mahrouss (amlel)
/// @brief Linker.
-// README: Do not look up for anything with .code64/.data64/.page_zero!
+// README: Do not look up for anything with .code64/.data64/.zero64!
// It will be loaded when program will start up!
#include <Headers/StdKit/ErrorID.hpp>
@@ -20,7 +20,7 @@
//! Assembler Kit
#include <Headers/AsmKit/AsmKit.hpp>
-//! Portable Executable Format
+//! Preferred Executable Format
#include <Headers/StdKit/PEF.hpp>
#include <Headers/UUID.hpp>
#include <filesystem>
@@ -71,7 +71,7 @@ static std::vector<std::string> kObjectList;
static std::vector<char> kObjectBytes;
#define kPrintF printf
-#define kSplashLink() kPrintF(kWhite kLinkerVersion, kDistVersion)
+#define kLinkerSplash() kPrintF(kWhite kLinkerVersion, kDistVersion)
MPCC_MODULE(NewOSLinker) {
bool is_executable = true;
@@ -82,7 +82,7 @@ MPCC_MODULE(NewOSLinker) {
*/
for (size_t i = 1; i < argc; ++i) {
if (StringCompare(argv[i], "-h") == 0) {
- kSplashLink();
+ kLinkerSplash();
kStdOut << "-version: Show program version.\n";
kStdOut << "-verbose: Enable program trace.\n";
kStdOut << "-shared: Output as a shared PEF.\n";
@@ -96,7 +96,7 @@ MPCC_MODULE(NewOSLinker) {
return 0;
} else if (StringCompare(argv[i], "-v") == 0) {
- kSplashLink();
+ kLinkerSplash();
return 0;
} else if (StringCompare(argv[i], "-fat-bin") == 0) {
kFatBinaryEnable = true;
@@ -114,7 +114,7 @@ MPCC_MODULE(NewOSLinker) {
kArch = CompilerKit::kPefArch32000;
continue;
- } else if (StringCompare(argv[i], "-ppc64") == 0) {
+ } else if (StringCompare(argv[i], "-power64") == 0) {
kArch = CompilerKit::kPefArchPowerPC;
continue;
@@ -255,7 +255,7 @@ MPCC_MODULE(NewOSLinker) {
pef_container.Count = cnt;
char_type *raw_ae_records =
- new char[cnt * sizeof(CompilerKit::AERecordHeader)];
+ new char_type[cnt * sizeof(CompilerKit::AERecordHeader)];
memset(raw_ae_records, 0, cnt * sizeof(CompilerKit::AERecordHeader));
auto *ae_records = readProto.Read(raw_ae_records, cnt);
@@ -272,7 +272,7 @@ MPCC_MODULE(NewOSLinker) {
std::string::npos &&
std::string(command_header.Name).find(".data64") ==
std::string::npos &&
- std::string(command_header.Name).find(".page_zero") ==
+ std::string(command_header.Name).find(".zero64") ==
std::string::npos) {
if (std::string(command_header.Name).find(kPefStart) ==
std::string::npos &&
@@ -295,15 +295,18 @@ MPCC_MODULE(NewOSLinker) {
}
ld_mark_header:
- command_header.Offset = ae_records[ae_record_index].fOffset;
+ command_header.Offset = ae_records[ae_record_index].fOffset + ae_header.fSize;
command_header.Kind = ae_records[ae_record_index].fKind;
command_header.Size = ae_records[ae_record_index].fSize;
command_header.Cpu = ae_header.fArch;
command_header.SubCpu = ae_header.fSubArch;
- if (kVerbose)
- kStdOut << "link: object record: "
- << ae_records[ae_record_index].fName << " was marked.\n";
+ if (kVerbose) {
+ kStdOut << "link: object record: "
+ << ae_records[ae_record_index].fName << " was marked.\n";
+
+ kStdOut << "link: object record offset: " << command_header.Offset << "\n";
+ }
commandHdrsList.emplace_back(command_header);
}
@@ -337,7 +340,7 @@ MPCC_MODULE(NewOSLinker) {
outputFc << pef_container;
if (kVerbose) {
- kStdOut << "link: pef: wrote container header.\n";
+ kStdOut << "link: wrote container header.\n";
}
outputFc.seekp(std::streamsize(pef_container.HdrSz));
@@ -441,7 +444,7 @@ MPCC_MODULE(NewOSLinker) {
dateHeader.Offset = outputFc.tellp();
dateHeader.Size = timeStampStr.size();
- outputFc << dateHeader;
+ commandHdrsList.push_back(dateHeader);
CompilerKit::PEFCommandHeader abiHeader{};
@@ -449,16 +452,16 @@ MPCC_MODULE(NewOSLinker) {
switch (kArch) {
case CompilerKit::kPefArchAMD64: {
- abi += "MS*T";
+ abi += "MSFT";
break;
}
case CompilerKit::kPefArchPowerPC: {
- abi += "MHRP";
+ abi += "SYSV";
break;
}
case CompilerKit::kPefArch32000:
case CompilerKit::kPefArch64000: {
- abi += "MHRC";
+ abi += "MHRA";
break;
}
default: {
@@ -474,7 +477,7 @@ MPCC_MODULE(NewOSLinker) {
abiHeader.Flags = 0;
abiHeader.Kind = CompilerKit::kPefLinkerID;
- outputFc << abiHeader;
+ commandHdrsList.push_back(abiHeader);
CompilerKit::PEFCommandHeader uuidHeader{};
@@ -498,13 +501,17 @@ MPCC_MODULE(NewOSLinker) {
uuidHeader.Flags = 0;
uuidHeader.Kind = CompilerKit::kPefZero;
- outputFc << uuidHeader;
+ commandHdrsList.push_back(uuidHeader);
// prepare a symbol vector.
std::vector<std::string> undefSymbols;
std::vector<std::string> duplSymbols;
std::vector<std::string> resolveSymbols;
+ constexpr Int32 cPaddingOffset = 16;
+
+ size_t previousOffset = (commandHdrsList.size() * sizeof(CompilerKit::PEFCommandHeader)) + cPaddingOffset;
+
// Finally write down the command headers.
// And check for any duplications
for (size_t commandHeaderIndex = 0UL;
@@ -523,6 +530,16 @@ MPCC_MODULE(NewOSLinker) {
undefSymbols.emplace_back(symbolName);
}
+ commandHdrsList[commandHeaderIndex].Offset += previousOffset;
+ previousOffset += commandHdrsList[commandHeaderIndex].Size;
+
+ if (kVerbose) {
+ kStdOut << "link: command header name: " <<
+ commandHdrsList[commandHeaderIndex].Name << "\n";
+ kStdOut << "link: real address of command header content: " <<
+ commandHdrsList[commandHeaderIndex].Offset << "\n";
+ }
+
outputFc << commandHdrsList[commandHeaderIndex];
for (size_t subCommandHeaderIndex = 0UL;
@@ -575,7 +592,7 @@ MPCC_MODULE(NewOSLinker) {
outputFc << byte;
}
- if (kVerbose) kStdOut << "link: wrote code for: " << kOutput << "\n";
+ if (kVerbose) kStdOut << "link: wrote contents of: " << kOutput << "\n";
// step 3: check if we have those symbols