mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:17:45 +00:00
LibELF+LibSymbolication: Remove i686 support
This commit is contained in:
parent
2f7443c900
commit
a4c87fac56
7 changed files with 1 additions and 94 deletions
|
@ -478,19 +478,12 @@ DynamicLoader::RelocationResult DynamicLoader::do_relocation(const ELF::DynamicO
|
||||||
};
|
};
|
||||||
|
|
||||||
switch (relocation.type()) {
|
switch (relocation.type()) {
|
||||||
#if ARCH(I386)
|
|
||||||
case R_386_NONE:
|
|
||||||
#else
|
|
||||||
case R_X86_64_NONE:
|
case R_X86_64_NONE:
|
||||||
#endif
|
|
||||||
// Apparently most loaders will just skip these?
|
// Apparently most loaders will just skip these?
|
||||||
// Seems if the 'link editor' generates one something is funky with your code
|
// Seems if the 'link editor' generates one something is funky with your code
|
||||||
break;
|
break;
|
||||||
#if ARCH(I386)
|
|
||||||
case R_386_32: {
|
|
||||||
#else
|
|
||||||
case R_X86_64_64: {
|
case R_X86_64_64: {
|
||||||
#endif
|
|
||||||
auto symbol = relocation.symbol();
|
auto symbol = relocation.symbol();
|
||||||
auto res = lookup_symbol(symbol);
|
auto res = lookup_symbol(symbol);
|
||||||
if (!res.has_value()) {
|
if (!res.has_value()) {
|
||||||
|
@ -508,20 +501,7 @@ DynamicLoader::RelocationResult DynamicLoader::do_relocation(const ELF::DynamicO
|
||||||
*patch_ptr = call_ifunc_resolver(VirtualAddress { *patch_ptr }).get();
|
*patch_ptr = call_ifunc_resolver(VirtualAddress { *patch_ptr }).get();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#if ARCH(I386)
|
|
||||||
case R_386_PC32: {
|
|
||||||
auto symbol = relocation.symbol();
|
|
||||||
auto result = lookup_symbol(symbol);
|
|
||||||
if (!result.has_value())
|
|
||||||
return RelocationResult::Failed;
|
|
||||||
auto relative_offset = result.value().address - m_dynamic_object->base_address().offset(relocation.offset());
|
|
||||||
*patch_ptr += relative_offset.get();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case R_386_GLOB_DAT: {
|
|
||||||
#else
|
|
||||||
case R_X86_64_GLOB_DAT: {
|
case R_X86_64_GLOB_DAT: {
|
||||||
#endif
|
|
||||||
auto symbol = relocation.symbol();
|
auto symbol = relocation.symbol();
|
||||||
auto res = lookup_symbol(symbol);
|
auto res = lookup_symbol(symbol);
|
||||||
VirtualAddress symbol_location;
|
VirtualAddress symbol_location;
|
||||||
|
@ -549,11 +529,7 @@ DynamicLoader::RelocationResult DynamicLoader::do_relocation(const ELF::DynamicO
|
||||||
*patch_ptr = symbol_location.get();
|
*patch_ptr = symbol_location.get();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#if ARCH(I386)
|
|
||||||
case R_386_RELATIVE: {
|
|
||||||
#else
|
|
||||||
case R_X86_64_RELATIVE: {
|
case R_X86_64_RELATIVE: {
|
||||||
#endif
|
|
||||||
if (!image().is_dynamic())
|
if (!image().is_dynamic())
|
||||||
break;
|
break;
|
||||||
// FIXME: According to the spec, R_386_relative ones must be done first.
|
// FIXME: According to the spec, R_386_relative ones must be done first.
|
||||||
|
@ -565,12 +541,7 @@ DynamicLoader::RelocationResult DynamicLoader::do_relocation(const ELF::DynamicO
|
||||||
*patch_ptr += m_dynamic_object->base_address().get();
|
*patch_ptr += m_dynamic_object->base_address().get();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#if ARCH(I386)
|
|
||||||
case R_386_TLS_TPOFF32:
|
|
||||||
case R_386_TLS_TPOFF: {
|
|
||||||
#else
|
|
||||||
case R_X86_64_TPOFF64: {
|
case R_X86_64_TPOFF64: {
|
||||||
#endif
|
|
||||||
auto symbol = relocation.symbol();
|
auto symbol = relocation.symbol();
|
||||||
FlatPtr symbol_value;
|
FlatPtr symbol_value;
|
||||||
DynamicObject const* dynamic_object_of_symbol;
|
DynamicObject const* dynamic_object_of_symbol;
|
||||||
|
@ -595,11 +566,7 @@ DynamicLoader::RelocationResult DynamicLoader::do_relocation(const ELF::DynamicO
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#if ARCH(I386)
|
|
||||||
case R_386_JMP_SLOT: {
|
|
||||||
#else
|
|
||||||
case R_X86_64_JUMP_SLOT: {
|
case R_X86_64_JUMP_SLOT: {
|
||||||
#endif
|
|
||||||
// FIXME: Or BIND_NOW flag passed in?
|
// FIXME: Or BIND_NOW flag passed in?
|
||||||
if (m_dynamic_object->must_bind_now()) {
|
if (m_dynamic_object->must_bind_now()) {
|
||||||
// Eagerly BIND_NOW the PLT entries, doing all the symbol looking goodness
|
// Eagerly BIND_NOW the PLT entries, doing all the symbol looking goodness
|
||||||
|
@ -613,11 +580,7 @@ DynamicLoader::RelocationResult DynamicLoader::do_relocation(const ELF::DynamicO
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#if ARCH(I386)
|
|
||||||
case R_386_IRELATIVE: {
|
|
||||||
#else
|
|
||||||
case R_X86_64_IRELATIVE: {
|
case R_X86_64_IRELATIVE: {
|
||||||
#endif
|
|
||||||
VirtualAddress resolver;
|
VirtualAddress resolver;
|
||||||
if (relocation.addend_used())
|
if (relocation.addend_used())
|
||||||
resolver = m_dynamic_object->base_address().offset(relocation.addend());
|
resolver = m_dynamic_object->base_address().offset(relocation.addend());
|
||||||
|
|
|
@ -484,11 +484,7 @@ NonnullRefPtr<DynamicObject> DynamicObject::create(DeprecatedString const& filep
|
||||||
VirtualAddress DynamicObject::patch_plt_entry(u32 relocation_offset)
|
VirtualAddress DynamicObject::patch_plt_entry(u32 relocation_offset)
|
||||||
{
|
{
|
||||||
auto relocation = plt_relocation_section().relocation_at_offset(relocation_offset);
|
auto relocation = plt_relocation_section().relocation_at_offset(relocation_offset);
|
||||||
#if ARCH(I386)
|
|
||||||
VERIFY(relocation.type() == R_386_JMP_SLOT);
|
|
||||||
#else
|
|
||||||
VERIFY(relocation.type() == R_X86_64_JUMP_SLOT);
|
VERIFY(relocation.type() == R_X86_64_JUMP_SLOT);
|
||||||
#endif
|
|
||||||
auto symbol = relocation.symbol();
|
auto symbol = relocation.symbol();
|
||||||
auto relocation_address = (FlatPtr*)relocation.address().as_ptr();
|
auto relocation_address = (FlatPtr*)relocation.address().as_ptr();
|
||||||
|
|
||||||
|
|
|
@ -65,19 +65,11 @@ public:
|
||||||
FlatPtr value() const { return m_sym.st_value; }
|
FlatPtr value() const { return m_sym.st_value; }
|
||||||
size_t size() const { return m_sym.st_size; }
|
size_t size() const { return m_sym.st_size; }
|
||||||
unsigned index() const { return m_index; }
|
unsigned index() const { return m_index; }
|
||||||
#if ARCH(I386)
|
|
||||||
unsigned type() const
|
|
||||||
{
|
|
||||||
return ELF32_ST_TYPE(m_sym.st_info);
|
|
||||||
}
|
|
||||||
unsigned bind() const { return ELF32_ST_BIND(m_sym.st_info); }
|
|
||||||
#else
|
|
||||||
unsigned type() const
|
unsigned type() const
|
||||||
{
|
{
|
||||||
return ELF64_ST_TYPE(m_sym.st_info);
|
return ELF64_ST_TYPE(m_sym.st_info);
|
||||||
}
|
}
|
||||||
unsigned bind() const { return ELF64_ST_BIND(m_sym.st_info); }
|
unsigned bind() const { return ELF64_ST_BIND(m_sym.st_info); }
|
||||||
#endif
|
|
||||||
|
|
||||||
bool is_undefined() const
|
bool is_undefined() const
|
||||||
{
|
{
|
||||||
|
@ -167,19 +159,11 @@ public:
|
||||||
|
|
||||||
unsigned offset_in_section() const { return m_offset_in_section; }
|
unsigned offset_in_section() const { return m_offset_in_section; }
|
||||||
unsigned offset() const { return m_rel.r_offset; }
|
unsigned offset() const { return m_rel.r_offset; }
|
||||||
#if ARCH(I386)
|
|
||||||
unsigned type() const
|
|
||||||
{
|
|
||||||
return ELF32_R_TYPE(m_rel.r_info);
|
|
||||||
}
|
|
||||||
unsigned symbol_index() const { return ELF32_R_SYM(m_rel.r_info); }
|
|
||||||
#else
|
|
||||||
unsigned type() const
|
unsigned type() const
|
||||||
{
|
{
|
||||||
return ELF64_R_TYPE(m_rel.r_info);
|
return ELF64_R_TYPE(m_rel.r_info);
|
||||||
}
|
}
|
||||||
unsigned symbol_index() const { return ELF64_R_SYM(m_rel.r_info); }
|
unsigned symbol_index() const { return ELF64_R_SYM(m_rel.r_info); }
|
||||||
#endif
|
|
||||||
unsigned addend() const
|
unsigned addend() const
|
||||||
{
|
{
|
||||||
VERIFY(m_addend_used);
|
VERIFY(m_addend_used);
|
||||||
|
|
|
@ -58,19 +58,11 @@ public:
|
||||||
FlatPtr value() const { return m_sym.st_value; }
|
FlatPtr value() const { return m_sym.st_value; }
|
||||||
size_t size() const { return m_sym.st_size; }
|
size_t size() const { return m_sym.st_size; }
|
||||||
unsigned index() const { return m_index; }
|
unsigned index() const { return m_index; }
|
||||||
#if ARCH(I386)
|
|
||||||
unsigned type() const
|
|
||||||
{
|
|
||||||
return ELF32_ST_TYPE(m_sym.st_info);
|
|
||||||
}
|
|
||||||
unsigned bind() const { return ELF32_ST_BIND(m_sym.st_info); }
|
|
||||||
#else
|
|
||||||
unsigned type() const
|
unsigned type() const
|
||||||
{
|
{
|
||||||
return ELF64_ST_TYPE(m_sym.st_info);
|
return ELF64_ST_TYPE(m_sym.st_info);
|
||||||
}
|
}
|
||||||
unsigned bind() const { return ELF64_ST_BIND(m_sym.st_info); }
|
unsigned bind() const { return ELF64_ST_BIND(m_sym.st_info); }
|
||||||
#endif
|
|
||||||
Section section() const
|
Section section() const
|
||||||
{
|
{
|
||||||
return m_image.section(section_index());
|
return m_image.section(section_index());
|
||||||
|
@ -169,19 +161,11 @@ public:
|
||||||
~Relocation() = default;
|
~Relocation() = default;
|
||||||
|
|
||||||
size_t offset() const { return m_rel.r_offset; }
|
size_t offset() const { return m_rel.r_offset; }
|
||||||
#if ARCH(I386)
|
|
||||||
unsigned type() const
|
|
||||||
{
|
|
||||||
return ELF32_R_TYPE(m_rel.r_info);
|
|
||||||
}
|
|
||||||
unsigned symbol_index() const { return ELF32_R_SYM(m_rel.r_info); }
|
|
||||||
#else
|
|
||||||
unsigned type() const
|
unsigned type() const
|
||||||
{
|
{
|
||||||
return ELF64_R_TYPE(m_rel.r_info);
|
return ELF64_R_TYPE(m_rel.r_info);
|
||||||
}
|
}
|
||||||
unsigned symbol_index() const { return ELF64_R_SYM(m_rel.r_info); }
|
unsigned symbol_index() const { return ELF64_R_SYM(m_rel.r_info); }
|
||||||
#endif
|
|
||||||
Symbol symbol() const
|
Symbol symbol() const
|
||||||
{
|
{
|
||||||
return m_image.symbol(symbol_index());
|
return m_image.symbol(symbol_index());
|
||||||
|
|
|
@ -59,11 +59,7 @@ bool perform_relative_relocations(FlatPtr base_address)
|
||||||
for (unsigned i = 0; i < relocation_count; ++i) {
|
for (unsigned i = 0; i < relocation_count; ++i) {
|
||||||
size_t offset_in_section = i * relocation_entry_size;
|
size_t offset_in_section = i * relocation_entry_size;
|
||||||
auto* relocation = (ElfW(Rela)*)(relocation_section_addr + offset_in_section);
|
auto* relocation = (ElfW(Rela)*)(relocation_section_addr + offset_in_section);
|
||||||
#if ARCH(I386)
|
|
||||||
VERIFY(ELF32_R_TYPE(relocation->r_info) == R_386_RELATIVE);
|
|
||||||
#else
|
|
||||||
VERIFY(ELF64_R_TYPE(relocation->r_info) == R_X86_64_RELATIVE);
|
VERIFY(ELF64_R_TYPE(relocation->r_info) == R_X86_64_RELATIVE);
|
||||||
#endif
|
|
||||||
auto* patch_address = (FlatPtr*)(base_address + relocation->r_offset);
|
auto* patch_address = (FlatPtr*)(base_address + relocation->r_offset);
|
||||||
FlatPtr relocated_address;
|
FlatPtr relocated_address;
|
||||||
if (use_addend) {
|
if (use_addend) {
|
||||||
|
|
|
@ -23,13 +23,8 @@ bool validate_elf_header(ElfW(Ehdr) const& elf_header, size_t file_size, bool ve
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ARCH(I386)
|
|
||||||
auto expected_class = ELFCLASS32;
|
|
||||||
auto expected_bitness = 32;
|
|
||||||
#else
|
|
||||||
auto expected_class = ELFCLASS64;
|
auto expected_class = ELFCLASS64;
|
||||||
auto expected_bitness = 64;
|
auto expected_bitness = 64;
|
||||||
#endif
|
|
||||||
if (expected_class != elf_header.e_ident[EI_CLASS]) {
|
if (expected_class != elf_header.e_ident[EI_CLASS]) {
|
||||||
if (verbose)
|
if (verbose)
|
||||||
dbgln("File is not a {}-bit ELF file.", expected_bitness);
|
dbgln("File is not a {}-bit ELF file.", expected_bitness);
|
||||||
|
@ -61,13 +56,8 @@ bool validate_elf_header(ElfW(Ehdr) const& elf_header, size_t file_size, bool ve
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ARCH(I386)
|
|
||||||
auto expected_machine = EM_386;
|
|
||||||
auto expected_machine_name = "i386";
|
|
||||||
#else
|
|
||||||
auto expected_machine = EM_X86_64;
|
auto expected_machine = EM_X86_64;
|
||||||
auto expected_machine_name = "x86-64";
|
auto expected_machine_name = "x86-64";
|
||||||
#endif
|
|
||||||
|
|
||||||
if (expected_machine != elf_header.e_machine) {
|
if (expected_machine != elf_header.e_machine) {
|
||||||
if (verbose)
|
if (verbose)
|
||||||
|
|
|
@ -43,13 +43,7 @@ Optional<FlatPtr> kernel_base()
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
auto kernel_base_str = DeprecatedString { file.value()->read_all(), NoChomp };
|
auto kernel_base_str = DeprecatedString { file.value()->read_all(), NoChomp };
|
||||||
#if ARCH(I386)
|
|
||||||
using AddressType = u32;
|
|
||||||
#elif ARCH(X86_64) || ARCH(AARCH64)
|
|
||||||
using AddressType = u64;
|
using AddressType = u64;
|
||||||
#else
|
|
||||||
# error Unknown architecture
|
|
||||||
#endif
|
|
||||||
auto maybe_kernel_base = kernel_base_str.to_uint<AddressType>();
|
auto maybe_kernel_base = kernel_base_str.to_uint<AddressType>();
|
||||||
if (!maybe_kernel_base.has_value()) {
|
if (!maybe_kernel_base.has_value()) {
|
||||||
s_kernel_base_state = KernelBaseState::Invalid;
|
s_kernel_base_state = KernelBaseState::Invalid;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue