diff options
Diffstat (limited to 'src/core/loader')
| -rw-r--r-- | src/core/loader/linker.cpp | 12 | ||||
| -rw-r--r-- | src/core/loader/nso.cpp | 3 | ||||
| -rw-r--r-- | src/core/loader/nso.h | 3 |
3 files changed, 8 insertions, 10 deletions
diff --git a/src/core/loader/linker.cpp b/src/core/loader/linker.cpp index f82c6f4b4..87cc65e91 100644 --- a/src/core/loader/linker.cpp +++ b/src/core/loader/linker.cpp | |||
| @@ -48,9 +48,9 @@ struct Elf64_Sym { | |||
| 48 | }; | 48 | }; |
| 49 | static_assert(sizeof(Elf64_Sym) == 0x18, "Elf64_Sym has incorrect size."); | 49 | static_assert(sizeof(Elf64_Sym) == 0x18, "Elf64_Sym has incorrect size."); |
| 50 | 50 | ||
| 51 | void Linker::WriteRelocations(std::vector<u8>& program_image, | 51 | void Linker::WriteRelocations(std::vector<u8>& program_image, const std::vector<Symbol>& symbols, |
| 52 | const std::vector<Symbol>& symbols, u64 relocation_offset, | 52 | u64 relocation_offset, u64 size, bool is_jump_relocation, |
| 53 | u64 size, bool is_jump_relocation, VAddr load_base) { | 53 | VAddr load_base) { |
| 54 | for (u64 i = 0; i < size; i += sizeof(Elf64_Rela)) { | 54 | for (u64 i = 0; i < size; i += sizeof(Elf64_Rela)) { |
| 55 | Elf64_Rela rela; | 55 | Elf64_Rela rela; |
| 56 | std::memcpy(&rela, &program_image[relocation_offset + i], sizeof(Elf64_Rela)); | 56 | std::memcpy(&rela, &program_image[relocation_offset + i], sizeof(Elf64_Rela)); |
| @@ -90,8 +90,7 @@ void Linker::WriteRelocations(std::vector<u8>& program_image, | |||
| 90 | } | 90 | } |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | void Linker::Relocate(std::vector<u8>& program_image, u32 dynamic_section_offset, | 93 | void Linker::Relocate(std::vector<u8>& program_image, u32 dynamic_section_offset, VAddr load_base) { |
| 94 | VAddr load_base) { | ||
| 95 | std::map<u64, u64> dynamic; | 94 | std::map<u64, u64> dynamic; |
| 96 | while (dynamic_section_offset < program_image.size()) { | 95 | while (dynamic_section_offset < program_image.size()) { |
| 97 | Elf64_Dyn dyn; | 96 | Elf64_Dyn dyn; |
| @@ -141,8 +140,7 @@ void Linker::ResolveImports() { | |||
| 141 | const auto& search = exports.find(import.first); | 140 | const auto& search = exports.find(import.first); |
| 142 | if (search != exports.end()) { | 141 | if (search != exports.end()) { |
| 143 | Memory::Write64(import.second.ea, search->second + import.second.addend); | 142 | Memory::Write64(import.second.ea, search->second + import.second.addend); |
| 144 | } | 143 | } else { |
| 145 | else { | ||
| 146 | LOG_ERROR(Loader, "Unresolved import: %s", import.first.c_str()); | 144 | LOG_ERROR(Loader, "Unresolved import: %s", import.first.c_str()); |
| 147 | } | 145 | } |
| 148 | } | 146 | } |
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index 7e1953701..a7d714bc8 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp | |||
| @@ -157,7 +157,8 @@ ResultStatus AppLoader_NSO::Load(Kernel::SharedPtr<Kernel::Process>& process) { | |||
| 157 | 157 | ||
| 158 | // Load NSO modules | 158 | // Load NSO modules |
| 159 | VAddr next_load_addr{Memory::PROCESS_IMAGE_VADDR}; | 159 | VAddr next_load_addr{Memory::PROCESS_IMAGE_VADDR}; |
| 160 | for (const auto& module : {"rtld", "sdk", "subsdk0", "subsdk1", "subsdk2", "subsdk3", "subsdk4"}) { | 160 | for (const auto& module : |
| 161 | {"rtld", "sdk", "subsdk0", "subsdk1", "subsdk2", "subsdk3", "subsdk4"}) { | ||
| 161 | const std::string path = filepath.substr(0, filepath.find_last_of("/\\")) + "/" + module; | 162 | const std::string path = filepath.substr(0, filepath.find_last_of("/\\")) + "/" + module; |
| 162 | const VAddr load_addr = next_load_addr; | 163 | const VAddr load_addr = next_load_addr; |
| 163 | next_load_addr = LoadNso(path, load_addr); | 164 | next_load_addr = LoadNso(path, load_addr); |
diff --git a/src/core/loader/nso.h b/src/core/loader/nso.h index 28df00384..03424e70d 100644 --- a/src/core/loader/nso.h +++ b/src/core/loader/nso.h | |||
| @@ -18,8 +18,7 @@ namespace Loader { | |||
| 18 | class AppLoader_NSO final : public AppLoader, Linker { | 18 | class AppLoader_NSO final : public AppLoader, Linker { |
| 19 | public: | 19 | public: |
| 20 | AppLoader_NSO(FileUtil::IOFile&& file, std::string filepath) | 20 | AppLoader_NSO(FileUtil::IOFile&& file, std::string filepath) |
| 21 | : AppLoader(std::move(file)), filepath(std::move(filepath)) { | 21 | : AppLoader(std::move(file)), filepath(std::move(filepath)) {} |
| 22 | } | ||
| 23 | 22 | ||
| 24 | /** | 23 | /** |
| 25 | * Returns the type of the file | 24 | * Returns the type of the file |