1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 14:27:35 +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)
{
auto result = ELF::DynamicLoader::try_create(fd, filename, filepath);
auto result = ELF::DynamicLoader::try_create(fd, filepath);
if (result.is_error()) {
return result;
}
@ -373,7 +373,7 @@ static Result<void, DlErrorMessage> link_main_library(String const& name, int fl
for (auto& loader : loaders) {
bool success = loader.link(flags);
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());
auto& object = result.value();
if (loader.filename() == "libsystem.so"sv) {
if (loader.filepath().ends_with("/libsystem.so"sv)) {
VERIFY(!loader.text_segments().is_empty());
for (auto const& segment : loader.text_segments()) {
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);
}
}

View file

@ -37,7 +37,7 @@ static void* mmap_with_name(void* addr, size_t length, int prot, int flags, int
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('/'));
@ -49,7 +49,7 @@ Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> DynamicLoader::try_create(i
VERIFY(stat.st_size >= 0);
auto size = static_cast<size_t>(stat.st_size);
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);
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" };
}
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())
return DlErrorMessage { "ELF image validation failed" };
return loader;
}
DynamicLoader::DynamicLoader(int fd, String filename, void* data, size_t size, String filepath)
: m_filename(move(filename))
, m_filepath(move(filepath))
DynamicLoader::DynamicLoader(int fd, String filepath, void* data, size_t size)
: m_filepath(move(filepath))
, m_file_size(size)
, m_image_fd(fd)
, m_file_data(data)
@ -75,7 +74,7 @@ DynamicLoader::DynamicLoader(int fd, String filename, void* data, size_t size, S
if (m_valid)
find_tls_size_and_alignment();
else
dbgln("Image validation failed for file {}", m_filename);
dbgln("Image validation failed for file {}", m_filepath);
}
DynamicLoader::~DynamicLoader()
@ -204,7 +203,7 @@ void DynamicLoader::do_main_relocations()
auto do_single_relocation = [&](const ELF::DynamicObject::Relocation& relocation) {
switch (do_relocation(relocation, ShouldInitializeWeak::No)) {
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();
case RelocationResult::ResolveLater:
m_unresolved_relocations.append(relocation);
@ -264,7 +263,7 @@ void DynamicLoader::do_lazy_relocations()
{
for (auto const& relocation : m_unresolved_relocations) {
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();
}
}

View file

@ -42,10 +42,10 @@ enum class ShouldInitializeWeak {
class DynamicLoader : public RefCounted<DynamicLoader> {
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();
String const& filename() const { return m_filename; }
String const& filepath() const { return m_filepath; }
bool is_valid() const { return m_valid; }
@ -87,7 +87,7 @@ public:
bool is_fully_initialized() const { return m_fully_initialized; }
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 {
public:
@ -137,7 +137,6 @@ private:
void do_relr_relocations();
void find_tls_size_and_alignment();
String m_filename;
String m_filepath;
size_t m_file_size { 0 };
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));
auto result = ELF::DynamicLoader::try_create(fd, path, path);
auto result = ELF::DynamicLoader::try_create(fd, path);
if (result.is_error()) {
outln("{}", result.error().text);
return 1;