1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 00:57:45 +00:00

LibELF: Drop the separate file name member from DynamicLoader

This commit is contained in:
Tim Schumacher 2022-10-28 16:48:48 +02:00 committed by Linus Groh
parent 177a5baf60
commit d0d494a151
4 changed files with 16 additions and 18 deletions

View file

@ -89,7 +89,7 @@ static String get_library_name(String path)
static Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> map_library(String const& filename, int fd, String const& filepath) static Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> map_library(String const& filename, int fd, String const& filepath)
{ {
auto result = ELF::DynamicLoader::try_create(fd, filename, filepath); auto result = ELF::DynamicLoader::try_create(fd, filepath);
if (result.is_error()) { if (result.is_error()) {
return result; return result;
} }
@ -373,7 +373,7 @@ static Result<void, DlErrorMessage> link_main_library(String const& name, int fl
for (auto& loader : loaders) { for (auto& loader : loaders) {
bool success = loader.link(flags); bool success = loader.link(flags);
if (!success) { if (!success) {
return DlErrorMessage { String::formatted("Failed to link library {}", loader.filename()) }; return DlErrorMessage { String::formatted("Failed to link library {}", loader.filepath()) };
} }
} }
@ -382,7 +382,7 @@ static Result<void, DlErrorMessage> link_main_library(String const& name, int fl
VERIFY(!result.is_error()); VERIFY(!result.is_error());
auto& object = result.value(); auto& object = result.value();
if (loader.filename() == "libsystem.so"sv) { if (loader.filepath().ends_with("/libsystem.so"sv)) {
VERIFY(!loader.text_segments().is_empty()); VERIFY(!loader.text_segments().is_empty());
for (auto const& segment : loader.text_segments()) { for (auto const& segment : loader.text_segments()) {
if (syscall(SC_msyscall, segment.address().get())) { if (syscall(SC_msyscall, segment.address().get())) {
@ -391,7 +391,7 @@ static Result<void, DlErrorMessage> link_main_library(String const& name, int fl
} }
} }
if (loader.filename() == "libc.so"sv) { if (loader.filepath().ends_with("/libc.so"sv)) {
initialize_libc(*object); initialize_libc(*object);
} }
} }

View file

@ -37,7 +37,7 @@ static void* mmap_with_name(void* addr, size_t length, int prot, int flags, int
namespace ELF { namespace ELF {
Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> DynamicLoader::try_create(int fd, String filename, String filepath) Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> DynamicLoader::try_create(int fd, String filepath)
{ {
VERIFY(filepath.starts_with('/')); VERIFY(filepath.starts_with('/'));
@ -49,7 +49,7 @@ Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> DynamicLoader::try_create(i
VERIFY(stat.st_size >= 0); VERIFY(stat.st_size >= 0);
auto size = static_cast<size_t>(stat.st_size); auto size = static_cast<size_t>(stat.st_size);
if (size < sizeof(ElfW(Ehdr))) if (size < sizeof(ElfW(Ehdr)))
return DlErrorMessage { String::formatted("File {} has invalid ELF header", filename) }; return DlErrorMessage { String::formatted("File {} has invalid ELF header", filepath) };
String file_mmap_name = String::formatted("ELF_DYN: {}", filepath); String file_mmap_name = String::formatted("ELF_DYN: {}", filepath);
auto* data = mmap_with_name(nullptr, size, PROT_READ, MAP_SHARED, fd, 0, file_mmap_name.characters()); auto* data = mmap_with_name(nullptr, size, PROT_READ, MAP_SHARED, fd, 0, file_mmap_name.characters());
@ -57,15 +57,14 @@ Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> DynamicLoader::try_create(i
return DlErrorMessage { "DynamicLoader::try_create mmap" }; return DlErrorMessage { "DynamicLoader::try_create mmap" };
} }
auto loader = adopt_ref(*new DynamicLoader(fd, move(filename), data, size, filepath)); auto loader = adopt_ref(*new DynamicLoader(fd, move(filepath), data, size));
if (!loader->is_valid()) if (!loader->is_valid())
return DlErrorMessage { "ELF image validation failed" }; return DlErrorMessage { "ELF image validation failed" };
return loader; return loader;
} }
DynamicLoader::DynamicLoader(int fd, String filename, void* data, size_t size, String filepath) DynamicLoader::DynamicLoader(int fd, String filepath, void* data, size_t size)
: m_filename(move(filename)) : m_filepath(move(filepath))
, m_filepath(move(filepath))
, m_file_size(size) , m_file_size(size)
, m_image_fd(fd) , m_image_fd(fd)
, m_file_data(data) , m_file_data(data)
@ -75,7 +74,7 @@ DynamicLoader::DynamicLoader(int fd, String filename, void* data, size_t size, S
if (m_valid) if (m_valid)
find_tls_size_and_alignment(); find_tls_size_and_alignment();
else else
dbgln("Image validation failed for file {}", m_filename); dbgln("Image validation failed for file {}", m_filepath);
} }
DynamicLoader::~DynamicLoader() DynamicLoader::~DynamicLoader()
@ -204,7 +203,7 @@ void DynamicLoader::do_main_relocations()
auto do_single_relocation = [&](const ELF::DynamicObject::Relocation& relocation) { auto do_single_relocation = [&](const ELF::DynamicObject::Relocation& relocation) {
switch (do_relocation(relocation, ShouldInitializeWeak::No)) { switch (do_relocation(relocation, ShouldInitializeWeak::No)) {
case RelocationResult::Failed: case RelocationResult::Failed:
dbgln("Loader.so: {} unresolved symbol '{}'", m_filename, relocation.symbol().name()); dbgln("Loader.so: {} unresolved symbol '{}'", m_filepath, relocation.symbol().name());
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
case RelocationResult::ResolveLater: case RelocationResult::ResolveLater:
m_unresolved_relocations.append(relocation); m_unresolved_relocations.append(relocation);
@ -264,7 +263,7 @@ void DynamicLoader::do_lazy_relocations()
{ {
for (auto const& relocation : m_unresolved_relocations) { for (auto const& relocation : m_unresolved_relocations) {
if (auto res = do_relocation(relocation, ShouldInitializeWeak::Yes); res != RelocationResult::Success) { if (auto res = do_relocation(relocation, ShouldInitializeWeak::Yes); res != RelocationResult::Success) {
dbgln("Loader.so: {} unresolved symbol '{}'", m_filename, relocation.symbol().name()); dbgln("Loader.so: {} unresolved symbol '{}'", m_filepath, relocation.symbol().name());
VERIFY_NOT_REACHED(); VERIFY_NOT_REACHED();
} }
} }

View file

@ -42,10 +42,10 @@ enum class ShouldInitializeWeak {
class DynamicLoader : public RefCounted<DynamicLoader> { class DynamicLoader : public RefCounted<DynamicLoader> {
public: public:
static Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> try_create(int fd, String filename, String filepath); static Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> try_create(int fd, String filepath);
~DynamicLoader(); ~DynamicLoader();
String const& filename() const { return m_filename; } String const& filepath() const { return m_filepath; }
bool is_valid() const { return m_valid; } bool is_valid() const { return m_valid; }
@ -87,7 +87,7 @@ public:
bool is_fully_initialized() const { return m_fully_initialized; } bool is_fully_initialized() const { return m_fully_initialized; }
private: private:
DynamicLoader(int fd, String filename, void* file_data, size_t file_size, String filepath); DynamicLoader(int fd, String filepath, void* file_data, size_t file_size);
class ProgramHeaderRegion { class ProgramHeaderRegion {
public: public:
@ -137,7 +137,6 @@ private:
void do_relr_relocations(); void do_relr_relocations();
void find_tls_size_and_alignment(); void find_tls_size_and_alignment();
String m_filename;
String m_filepath; String m_filepath;
size_t m_file_size { 0 }; size_t m_file_size { 0 };
int m_image_fd { -1 }; int m_image_fd { -1 };

View file

@ -339,7 +339,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
} }
int fd = TRY(Core::System::open(path, O_RDONLY)); int fd = TRY(Core::System::open(path, O_RDONLY));
auto result = ELF::DynamicLoader::try_create(fd, path, path); auto result = ELF::DynamicLoader::try_create(fd, path);
if (result.is_error()) { if (result.is_error()) {
outln("{}", result.error().text); outln("{}", result.error().text);
return 1; return 1;