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:
parent
177a5baf60
commit
d0d494a151
4 changed files with 16 additions and 18 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 };
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue