mirror of
https://github.com/Atmosphere-NX/Atmosphere-libs.git
synced 2025-06-22 03:22:39 +02:00
meso: miscellaneous cleanup and build fixes
This commit is contained in:
parent
ab902694f7
commit
e89e0cc45d
@ -52,7 +52,7 @@ ATMOSPHERE_DEFINES += -DATMOSPHERE_GIT_BRANCH=\"$(ATMOSPHERE_GIT_BRANCH)\" -DATM
|
|||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
# Ensure top directory is set.
|
# Ensure top directory is set.
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
export TOPDIR ?= $(CURDIR)
|
TOPDIR ?= $(CURDIR)
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
# TARGET is the name of the output
|
# TARGET is the name of the output
|
||||||
@ -60,11 +60,11 @@ export TOPDIR ?= $(CURDIR)
|
|||||||
# DATA is a list of directories containing data files
|
# DATA is a list of directories containing data files
|
||||||
# INCLUDES is a list of directories containing header files
|
# INCLUDES is a list of directories containing header files
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
export TARGET ?= $(notdir $(CURDIR))
|
TARGET := $(notdir $(CURDIR))
|
||||||
export BUILD := build
|
BUILD := build
|
||||||
export DATA := data
|
DATA := data
|
||||||
export INCLUDES := include
|
INCLUDES := include
|
||||||
export SOURCES ?= $(shell find source -type d \
|
SOURCES ?= $(shell find source -type d \
|
||||||
-not \( -path source/arch -prune \) \
|
-not \( -path source/arch -prune \) \
|
||||||
-not \( -path source/board -prune \) \)
|
-not \( -path source/board -prune \) \)
|
||||||
|
|
||||||
|
@ -18,5 +18,5 @@
|
|||||||
#ifdef ATMOSPHERE_ARCH_ARM64
|
#ifdef ATMOSPHERE_ARCH_ARM64
|
||||||
#include "../arch/arm64/init/kern_k_init_page_table.hpp"
|
#include "../arch/arm64/init/kern_k_init_page_table.hpp"
|
||||||
#else
|
#else
|
||||||
#error "Unknown architecutre for KInitialPageTable"
|
#error "Unknown architecture for KInitialPageTable"
|
||||||
#endif
|
#endif
|
||||||
|
@ -76,7 +76,9 @@ namespace ams::kern::init::Elf::Elf64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CallInitArrayFuncs(uintptr_t init_array_start, uintptr_t init_array_end) {
|
void CallInitArrayFuncs(uintptr_t init_array_start, uintptr_t init_array_end) {
|
||||||
|
for (uintptr_t cur_entry = init_array_start; cur_entry < init_array_end; cur_entry += sizeof(void *)) {
|
||||||
|
(*(void (**)())(cur_entry))();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,84 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2018-2019 Atmosphère-NX
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms and conditions of the GNU General Public License,
|
|
||||||
* version 2, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#include <mesosphere.hpp>
|
|
||||||
|
|
||||||
namespace ams::kern::init::Elf::Elf64 {
|
|
||||||
|
|
||||||
/* API to apply relocations or call init array. */
|
|
||||||
void ApplyRelocations(uintptr_t base_address, const Dyn *dynamic) {
|
|
||||||
uintptr_t dyn_rel = 0;
|
|
||||||
uintptr_t dyn_rela = 0;
|
|
||||||
uintptr_t rel_count = 0;
|
|
||||||
uintptr_t rela_count = 0;
|
|
||||||
uintptr_t rel_ent = 0;
|
|
||||||
uintptr_t rela_ent = 0;
|
|
||||||
|
|
||||||
/* Iterate over all tags, identifying important extents. */
|
|
||||||
for (const Dyn *cur_entry = dynamic; cur_entry->GetTag() != DT_NULL; cur_entry++) {
|
|
||||||
switch (cur_entry->GetTag()) {
|
|
||||||
case DT_REL:
|
|
||||||
dyn_rel = base_address + cur_entry->GetPtr();
|
|
||||||
break;
|
|
||||||
case DT_RELA:
|
|
||||||
dyn_rela = base_address + cur_entry->GetPtr();
|
|
||||||
break;
|
|
||||||
case DT_RELENT:
|
|
||||||
rel_ent = cur_entry->GetValue();
|
|
||||||
break;
|
|
||||||
case DT_RELAENT:
|
|
||||||
rela_ent = cur_entry->GetValue();
|
|
||||||
break;
|
|
||||||
case DT_RELCOUNT:
|
|
||||||
rel_count = cur_entry->GetValue();
|
|
||||||
break;
|
|
||||||
case DT_RELACOUNT:
|
|
||||||
rela_count = cur_entry->GetValue();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Apply all Rel relocations */
|
|
||||||
for (size_t i = 0; i < rel_count; i++) {
|
|
||||||
const auto &rel = *reinterpret_cast<const Elf64::Rel *>(dyn_rel + rel_ent * i);
|
|
||||||
|
|
||||||
/* Only allow R_AARCH64_RELATIVE relocations. */
|
|
||||||
while (rel.GetType() != R_AARCH64_RELATIVE) { /* ... */ }
|
|
||||||
|
|
||||||
/* Apply the relocation. */
|
|
||||||
Elf64::Addr *target_address = reinterpret_cast<Elf64::Addr *>(base_address + rel.GetOffset());
|
|
||||||
*target_address += base_address;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Apply all Rela relocations. */
|
|
||||||
for (size_t i = 0; i < rela_count; i++) {
|
|
||||||
const auto &rela = *reinterpret_cast<const Elf64::Rela *>(dyn_rela + rela_ent * i);
|
|
||||||
|
|
||||||
/* Only allow R_AARCH64_RELATIVE relocations. */
|
|
||||||
while (rela.GetType() != R_AARCH64_RELATIVE) { /* ... */ }
|
|
||||||
|
|
||||||
/* Apply the relocation. */
|
|
||||||
Elf64::Addr *target_address = reinterpret_cast<Elf64::Addr *>(base_address + rela.GetOffset());
|
|
||||||
*target_address = base_address + rela.GetAddend();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CallInitArrayFuncs(uintptr_t init_array_start, uintptr_t init_array_end) {
|
|
||||||
for (uintptr_t cur_entry = init_array_start; cur_entry < init_array_end; cur_entry += sizeof(void *)) {
|
|
||||||
(*(void (**)())(cur_entry))();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user