Skip to content

Commit

Permalink
LibELF: Store the full file path in DynamicObject
Browse files Browse the repository at this point in the history
Otherwise, our `dirname` call on the parent object will always be empty
when trying to resolve dependencies.
  • Loading branch information
timschumi authored and awesomekling committed Jun 30, 2022
1 parent dc805e6 commit e2036ca
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 16 deletions.
8 changes: 4 additions & 4 deletions Userland/Libraries/LibELF/DynamicLinker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ static Optional<String> resolve_library(String const& name, DynamicObject const&
search_paths.append("/usr/local/lib"sv);

for (auto const& search_path : search_paths) {
LexicalPath library_path(search_path.replace("$ORIGIN"sv, LexicalPath::dirname(parent_object.filename())));
LexicalPath library_path(search_path.replace("$ORIGIN"sv, LexicalPath::dirname(parent_object.filepath())));
String library_name = library_path.append(name).string();

if (access(library_name.characters(), F_OK) == 0)
Expand Down Expand Up @@ -233,7 +233,7 @@ static int __dl_iterate_phdr(DlIteratePhdrCallbackFunction callback, void* data)
auto& object = it.value;
auto info = dl_phdr_info {
.dlpi_addr = (ElfW(Addr))object->base_address().as_ptr(),
.dlpi_name = object->filename().characters(),
.dlpi_name = object->filepath().characters(),
.dlpi_phdr = object->program_headers(),
.dlpi_phnum = object->program_header_count()
};
Expand Down Expand Up @@ -337,7 +337,7 @@ static Result<void, DlErrorMessage> link_main_library(String const& name, int fl
for (auto& loader : loaders) {
auto dynamic_object = loader.map();
if (dynamic_object)
s_global_objects.set(dynamic_object->filename(), *dynamic_object);
s_global_objects.set(get_library_name(dynamic_object->filepath()), *dynamic_object);
}

for (auto& loader : loaders) {
Expand Down Expand Up @@ -529,7 +529,7 @@ static Result<void, DlErrorMessage> __dladdr(void* addr, Dl_info* info)

info->dli_fbase = best_matching_library->base_address().as_ptr();
// This works because we don't support unloading objects.
info->dli_fname = best_matching_library->filename().characters();
info->dli_fname = best_matching_library->filepath().characters();
if (best_matching_symbol.has_value()) {
info->dli_saddr = best_matching_symbol.value().address().as_ptr();
info->dli_sname = best_matching_symbol.value().raw_name();
Expand Down
6 changes: 3 additions & 3 deletions Userland/Libraries/LibELF/DynamicLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ DynamicObject const& DynamicLoader::dynamic_object() const
});
VERIFY(!dynamic_section_address.is_null());

m_cached_dynamic_object = ELF::DynamicObject::create(m_filename, VirtualAddress(image().base_address()), dynamic_section_address);
m_cached_dynamic_object = ELF::DynamicObject::create(m_filepath, VirtualAddress(image().base_address()), dynamic_section_address);
}
return *m_cached_dynamic_object;
}
Expand Down Expand Up @@ -146,7 +146,7 @@ RefPtr<DynamicObject> DynamicLoader::map()

VERIFY(!m_base_address.is_null());

m_dynamic_object = DynamicObject::create(m_filename, m_base_address, m_dynamic_section_address);
m_dynamic_object = DynamicObject::create(m_filepath, m_base_address, m_dynamic_section_address);
m_dynamic_object->set_tls_offset(m_tls_offset);
m_dynamic_object->set_tls_size(m_tls_size_of_current_object);

Expand All @@ -163,7 +163,7 @@ bool DynamicLoader::load_stage_2(unsigned flags)
VERIFY(flags & RTLD_GLOBAL);

if (m_dynamic_object->has_text_relocations()) {
dbgln("\033[33mWarning:\033[0m Dynamic object {} has text relocations", m_dynamic_object->filename());
dbgln("\033[33mWarning:\033[0m Dynamic object {} has text relocations", m_dynamic_object->filepath());
for (auto& text_segment : m_text_segments) {
VERIFY(text_segment.address().get() != 0);

Expand Down
10 changes: 5 additions & 5 deletions Userland/Libraries/LibELF/DynamicObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@

namespace ELF {

DynamicObject::DynamicObject(String const& filename, VirtualAddress base_address, VirtualAddress dynamic_section_address)
: m_filename(filename)
DynamicObject::DynamicObject(String const& filepath, VirtualAddress base_address, VirtualAddress dynamic_section_address)
: m_filepath(filepath)
, m_base_address(base_address)
, m_dynamic_address(dynamic_section_address)
{
Expand Down Expand Up @@ -474,9 +474,9 @@ auto DynamicObject::lookup_symbol(HashSymbol const& symbol) const -> Optional<Sy
return SymbolLookupResult { symbol_result.value(), symbol_result.size(), symbol_result.address(), symbol_result.bind(), symbol_result.type(), this };
}

NonnullRefPtr<DynamicObject> DynamicObject::create(String const& filename, VirtualAddress base_address, VirtualAddress dynamic_section_address)
NonnullRefPtr<DynamicObject> DynamicObject::create(String const& filepath, VirtualAddress base_address, VirtualAddress dynamic_section_address)
{
return adopt_ref(*new DynamicObject(filename, base_address, dynamic_section_address));
return adopt_ref(*new DynamicObject(filepath, base_address, dynamic_section_address));
}

// offset is in PLT relocation table
Expand All @@ -499,7 +499,7 @@ VirtualAddress DynamicObject::patch_plt_entry(u32 relocation_offset)
if (result.value().type == STT_GNU_IFUNC)
symbol_location = VirtualAddress { reinterpret_cast<IfuncResolver>(symbol_location.get())() };
} else if (symbol.bind() != STB_WEAK) {
dbgln("did not find symbol while doing relocations for library {}: {}", m_filename, symbol.name());
dbgln("did not find symbol while doing relocations for library {}: {}", m_filepath, symbol.name());
VERIFY_NOT_REACHED();
}

Expand Down
8 changes: 4 additions & 4 deletions Userland/Libraries/LibELF/DynamicObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ namespace ELF {

class DynamicObject : public RefCounted<DynamicObject> {
public:
static NonnullRefPtr<DynamicObject> create(String const& filename, VirtualAddress base_address, VirtualAddress dynamic_section_address);
static NonnullRefPtr<DynamicObject> create(String const& filepath, VirtualAddress base_address, VirtualAddress dynamic_section_address);
static char const* name_for_dtag(ElfW(Sword) d_tag);

~DynamicObject();
Expand Down Expand Up @@ -287,7 +287,7 @@ class DynamicObject : public RefCounted<DynamicObject> {
VirtualAddress plt_got_base_address() const { return m_base_address.offset(m_procedure_linkage_table_offset.value()); }
VirtualAddress base_address() const { return m_base_address; }

String const& filename() const { return m_filename; }
String const& filepath() const { return m_filepath; }

StringView rpath() const { return m_has_rpath ? symbol_string_table_string(m_rpath_index) : StringView {}; }
StringView runpath() const { return m_has_runpath ? symbol_string_table_string(m_runpath_index) : StringView {}; }
Expand Down Expand Up @@ -338,13 +338,13 @@ class DynamicObject : public RefCounted<DynamicObject> {
void* symbol_for_name(StringView name);

private:
explicit DynamicObject(String const& filename, VirtualAddress base_address, VirtualAddress dynamic_section_address);
explicit DynamicObject(String const& filepath, VirtualAddress base_address, VirtualAddress dynamic_section_address);

StringView symbol_string_table_string(ElfW(Word)) const;
char const* raw_symbol_string_table_string(ElfW(Word)) const;
void parse();

String m_filename;
String m_filepath;

VirtualAddress m_base_address;
VirtualAddress m_dynamic_address;
Expand Down

0 comments on commit e2036ca

Please sign in to comment.