mirror of
https://github.com/wiiu-env/wut.git
synced 2025-01-23 23:11:11 +01:00
elf2rpl: Add support for section deflation.
This commit is contained in:
parent
55b2695eaf
commit
d6478d831e
@ -10,9 +10,10 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <zlib.h>
|
#include <zlib.h>
|
||||||
|
|
||||||
constexpr auto CodeBaseAddress = 0x02000000;
|
constexpr auto DeflateMinSectionSize = 0x18u;
|
||||||
constexpr auto DataBaseAddress = 0x10000000;
|
constexpr auto CodeBaseAddress = 0x02000000u;
|
||||||
constexpr auto LoadBaseAddress = 0xC0000000;
|
constexpr auto DataBaseAddress = 0x10000000u;
|
||||||
|
constexpr auto LoadBaseAddress = 0xC0000000u;
|
||||||
|
|
||||||
struct ElfFile
|
struct ElfFile
|
||||||
{
|
{
|
||||||
@ -548,7 +549,6 @@ fixRelocations(ElfFile &file)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
section->data.insert(section->data.end(),
|
section->data.insert(section->data.end(),
|
||||||
reinterpret_cast<char *>(newRelocations.data()),
|
reinterpret_cast<char *>(newRelocations.data()),
|
||||||
reinterpret_cast<char *>(newRelocations.data() + newRelocations.size()));
|
reinterpret_cast<char *>(newRelocations.data() + newRelocations.size()));
|
||||||
@ -721,6 +721,61 @@ fixLoaderVirtualAddresses(ElfFile &file)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
deflateSections(ElfFile &file)
|
||||||
|
{
|
||||||
|
std::vector<char> chunk;
|
||||||
|
chunk.resize(16 * 1024);
|
||||||
|
|
||||||
|
for (auto §ion : file.sections) {
|
||||||
|
if (section->data.size() < DeflateMinSectionSize ||
|
||||||
|
section->header.type == elf::SHT_RPL_CRCS ||
|
||||||
|
section->header.type == elf::SHT_RPL_FILEINFO) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allocate space for the 4 bytes inflated size
|
||||||
|
std::vector<char> deflated;
|
||||||
|
deflated.resize(4);
|
||||||
|
|
||||||
|
// Deflate section data
|
||||||
|
auto stream = z_stream { };
|
||||||
|
memset(&stream, 0, sizeof(stream));
|
||||||
|
stream.zalloc = Z_NULL;
|
||||||
|
stream.zfree = Z_NULL;
|
||||||
|
stream.opaque = Z_NULL;
|
||||||
|
deflateInit(&stream, 6);
|
||||||
|
|
||||||
|
stream.avail_in = section->data.size();
|
||||||
|
stream.next_in = reinterpret_cast<Bytef *>(section->data.data());
|
||||||
|
|
||||||
|
do {
|
||||||
|
stream.avail_out = static_cast<uInt>(chunk.size());
|
||||||
|
stream.next_out = reinterpret_cast<Bytef *>(chunk.data());
|
||||||
|
|
||||||
|
auto ret = deflate(&stream, Z_FINISH);
|
||||||
|
if (ret == Z_STREAM_ERROR) {
|
||||||
|
deflateEnd(&stream);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
deflated.insert(deflated.end(),
|
||||||
|
chunk.data(),
|
||||||
|
reinterpret_cast<char *>(stream.next_out));
|
||||||
|
} while (stream.avail_out == 0);
|
||||||
|
deflateEnd(&stream);
|
||||||
|
|
||||||
|
// Set the inflated size at start of section
|
||||||
|
*reinterpret_cast<be_val<uint32_t> *>(&deflated[0]) =
|
||||||
|
static_cast<uint32_t>(section->data.size());
|
||||||
|
|
||||||
|
// Update the section data
|
||||||
|
section->data = std::move(deflated);
|
||||||
|
section->header.flags |= elf::SHF_DEFLATED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate section file offsets.
|
* Calculate section file offsets.
|
||||||
@ -943,6 +998,11 @@ int main(int argc, const char **argv)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!deflateSections(elf)) {
|
||||||
|
fmt::print("ERROR: deflateSections failed");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (!calculateSectionOffsets(elf)) {
|
if (!calculateSectionOffsets(elf)) {
|
||||||
fmt::print("ERROR: calculateSectionOffsets failed");
|
fmt::print("ERROR: calculateSectionOffsets failed");
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user