summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-11-08 15:36:48 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-11-08 15:36:48 +0100
commitb30c996fd86f43cec8b854a00d6938e537c7c57a (patch)
treec632f657f7cf4d4425df8c9dd619a2a25356e92f /dev
parent1dcf80cae33dc75a50f10714f2d65fd9bd04a060 (diff)
Linker: Add DynamicLinkerBlob structure and code improvements.
Diffstat (limited to 'dev')
-rw-r--r--dev/ToolchainKit/src/DynamicLinker64PEF.cc62
-rw-r--r--dev/ToolchainKit/src/String.cc2
2 files changed, 38 insertions, 26 deletions
diff --git a/dev/ToolchainKit/src/DynamicLinker64PEF.cc b/dev/ToolchainKit/src/DynamicLinker64PEF.cc
index ee3c956..b12998f 100644
--- a/dev/ToolchainKit/src/DynamicLinker64PEF.cc
+++ b/dev/ToolchainKit/src/DynamicLinker64PEF.cc
@@ -28,9 +28,11 @@
//! Advanced Executable Object Format
#include <ToolchainKit/NFC/AE.h>
+#include <cstdint>
#define kLinkerVersionStr "Amlal's 64-Bit Dynamic Linker %s, (c) EL Mahrouss Logic 2024, all rights reserved.\n"
+#define MemoryCopy(DST, SRC, SZ) memcpy(DST, SRC, SZ)
#define StringCompare(DST, SRC) strcmp(DST, SRC)
#define kPefNoCpu 0U
@@ -46,6 +48,15 @@
/// @brief PEF stack size symbol.
#define kLinkerStackSizeSymbol "SizeOfReserveStack"
+namespace detail
+{
+struct DynamicLinkerBlob final
+{
+ std::vector<CharType> fPefBlob; // PEF code/bss/data blob.
+ std::uintptr_t fAEOffset; // the offset of the PEF container header..
+};
+}
+
enum
{
kABITypeStart = 0x1010, /* Invalid ABI start of ABI list. */
@@ -68,7 +79,7 @@ static const char* kLdDynamicSym = ":RuntimeSymbol:";
/* object code and list. */
static std::vector<ToolchainKit::String> kObjectList;
-static std::vector<CharType> kObjectBytes;
+static std::vector<detail::DynamicLinkerBlob> kObjectBytes;
static uintptr_t kMIBCount = 8;
static uintptr_t kByteCount = 1024;
@@ -87,7 +98,7 @@ TOOLCHAINKIT_MODULE(DynamicLinker64PEF)
*/
for (size_t linker_arg = 1; linker_arg < argc; ++linker_arg)
{
- if (StringCompare(argv[linker_arg], "--ld64:?") == 0)
+ if (StringCompare(argv[linker_arg], "--ld64:help") == 0)
{
kLinkerSplash();
@@ -104,12 +115,12 @@ TOOLCHAINKIT_MODULE(DynamicLinker64PEF)
kStdOut << "--ld64:arm64: Output as a ARM64 PEF.\n";
kStdOut << "--ld64:output: Select the output file name.\n";
- return 0;
+ return EXIT_SUCCESS;
}
- else if (StringCompare(argv[linker_arg], "--ld64:ver") == 0)
+ else if (StringCompare(argv[linker_arg], "--ld64:version") == 0)
{
kLinkerSplash();
- return 0;
+ return EXIT_SUCCESS;
}
else if (StringCompare(argv[linker_arg], "--ld64:fat-binary") == 0)
{
@@ -187,7 +198,7 @@ TOOLCHAINKIT_MODULE(DynamicLinker64PEF)
if (argv[linker_arg][0] == '-')
{
kStdOut << "ld64: unknown flag: " << argv[linker_arg] << "\n";
- continue;
+ return EXIT_FAILURE;
}
kObjectList.emplace_back(argv[linker_arg]);
@@ -329,9 +340,9 @@ TOOLCHAINKIT_MODULE(DynamicLinker64PEF)
++ae_record_index)
{
ToolchainKit::PEFCommandHeader command_header{0};
- size_t offset_of_obj = ae_records[ae_record_index].fOffset;
+ std::size_t offset_of_obj = ae_records[ae_record_index].fOffset;
- memcpy(command_header.Name, ae_records[ae_record_index].fName,
+ MemoryCopy(command_header.Name, ae_records[ae_record_index].fName,
kPefNameLen);
ToolchainKit::String cmd_hdr_name(command_header.Name);
@@ -377,10 +388,10 @@ TOOLCHAINKIT_MODULE(DynamicLinker64PEF)
if (kVerbose)
{
- kStdOut << "ld64: record: "
+ kStdOut << "ld64: Record: "
<< ae_records[ae_record_index].fName << " is marked.\n";
- kStdOut << "ld64: record offset: " << command_header.Offset << "\n";
+ kStdOut << "ld64: Record offset: " << command_header.Offset << "\n";
}
command_headers.emplace_back(command_header);
@@ -398,7 +409,7 @@ TOOLCHAINKIT_MODULE(DynamicLinker64PEF)
for (auto& byte : bytes)
{
- kObjectBytes.push_back(byte);
+ kObjectBytes.push_back({ .fPefBlob = bytes, .fAEOffset = ae_header.fStartCode });
}
reader_protocol.FP.close();
@@ -406,7 +417,7 @@ TOOLCHAINKIT_MODULE(DynamicLinker64PEF)
continue;
}
- kStdOut << "ld64: not an object file: " << objectFile << std::endl;
+ kStdOut << "ld64: Not an object container: " << objectFile << std::endl;
// don't continue, it is a fatal error.
return TOOLCHAINKIT_EXEC_ERROR;
}
@@ -417,7 +428,7 @@ TOOLCHAINKIT_MODULE(DynamicLinker64PEF)
if (kVerbose)
{
- kStdOut << "ld64: wrote container header.\n";
+ kStdOut << "ld64: Wrote container header.\n";
}
output_fc.seekp(std::streamsize(pef_container.HdrSz));
@@ -435,7 +446,7 @@ TOOLCHAINKIT_MODULE(DynamicLinker64PEF)
ToolchainKit::String(command_hdr.Name).find(kLdDynamicSym) == ToolchainKit::String::npos)
{
if (kVerbose)
- kStdOut << "ld64: found undefined symbol: " << command_hdr.Name << "\n";
+ kStdOut << "ld64: Found undefined symbol: " << command_hdr.Name << "\n";
if (auto it = std::find(not_found.begin(), not_found.end(),
ToolchainKit::String(command_hdr.Name));
@@ -453,7 +464,7 @@ TOOLCHAINKIT_MODULE(DynamicLinker64PEF)
for (size_t not_found_idx = 0; not_found_idx < command_headers.size();
++not_found_idx)
{
- if (auto it = std::find(not_found.begin(), not_found.end(),
+ if (const auto it = std::find(not_found.begin(), not_found.end(),
ToolchainKit::String(command_headers[not_found_idx].Name));
it != not_found.end())
{
@@ -559,7 +570,7 @@ TOOLCHAINKIT_MODULE(DynamicLinker64PEF)
}
}
- memcpy(abi_cmd_hdr.Name, abi.c_str(), abi.size());
+ MemoryCopy(abi_cmd_hdr.Name, abi.c_str(), abi.size());
abi_cmd_hdr.Size = abi.size();
abi_cmd_hdr.Offset = output_fc.tellp();
@@ -574,7 +585,8 @@ TOOLCHAINKIT_MODULE(DynamicLinker64PEF)
stack_cmd_hdr.Flags = 0;
stack_cmd_hdr.Size = sizeof(uintptr_t);
stack_cmd_hdr.Offset = 0;
- memcpy(stack_cmd_hdr.Name, kLinkerStackSizeSymbol, strlen(kLinkerStackSizeSymbol));
+
+ MemoryCopy(stack_cmd_hdr.Name, kLinkerStackSizeSymbol, strlen(kLinkerStackSizeSymbol));
command_headers.push_back(stack_cmd_hdr);
@@ -591,8 +603,8 @@ TOOLCHAINKIT_MODULE(DynamicLinker64PEF)
uuids::uuid id = gen();
auto uuidStr = uuids::to_string(id);
- memcpy(uuid_cmd_hdr.Name, "Container:GUID:4:", strlen("Container:GUID:4:"));
- memcpy(uuid_cmd_hdr.Name + strlen("Container:GUID:4:"), uuidStr.c_str(),
+ MemoryCopy(uuid_cmd_hdr.Name, "Container:GUID:4:", strlen("Container:GUID:4:"));
+ MemoryCopy(uuid_cmd_hdr.Name + strlen("Container:GUID:4:"), uuidStr.c_str(),
uuidStr.size());
uuid_cmd_hdr.Size = strlen(uuid_cmd_hdr.Name);
@@ -654,8 +666,8 @@ TOOLCHAINKIT_MODULE(DynamicLinker64PEF)
if (kVerbose)
{
- kStdOut << "ld64: command header name: " << name << "\n";
- kStdOut << "ld64: real address of command header content: " << command_headers[commandHeaderIndex].Offset << "\n";
+ kStdOut << "ld64: Command header name: " << name << "\n";
+ kStdOut << "ld64: Real address of command header content: " << command_headers[commandHeaderIndex].Offset << "\n";
}
output_fc << command_headers[commandHeaderIndex];
@@ -705,7 +717,7 @@ TOOLCHAINKIT_MODULE(DynamicLinker64PEF)
{
for (auto& symbol : dupl_symbols)
{
- kStdOut << "ld64: multiple symbols of " << symbol << ".\n";
+ kStdOut << "ld64: Multiple symbols of " << symbol << ".\n";
}
return TOOLCHAINKIT_EXEC_ERROR;
@@ -713,9 +725,9 @@ TOOLCHAINKIT_MODULE(DynamicLinker64PEF)
// step 2.5: write program bytes.
- for (auto byte : kObjectBytes)
+ for (auto& struct_of_blob : kObjectBytes)
{
- output_fc << byte;
+ output_fc.write(struct_of_blob.fPefBlob.data(), struct_of_blob.fPefBlob.size());
}
if (kVerbose)
@@ -753,7 +765,7 @@ TOOLCHAINKIT_MODULE(DynamicLinker64PEF)
return TOOLCHAINKIT_EXEC_ERROR;
}
- return 0;
+ return EXIT_SUCCESS;
}
// Last rev 13-1-24
diff --git a/dev/ToolchainKit/src/String.cc b/dev/ToolchainKit/src/String.cc
index de0cbfb..cb5aec4 100644
--- a/dev/ToolchainKit/src/String.cc
+++ b/dev/ToolchainKit/src/String.cc
@@ -9,7 +9,7 @@
/**
* @file String.cxx
- * @author Amlal (amlal@mahrouss-logic.com)
+ * @author Amlal (amlal@el-mahrouss-logic.com)
* @brief C++ string manipulation API.
* @version 0.2
* @date 2024-01-23