mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 16:18:12 +00:00
LibELF: Name library maps with the full file path
This commit is contained in:
parent
2b7b7f2816
commit
89da0f2da5
4 changed files with 17 additions and 15 deletions
|
@ -84,9 +84,9 @@ static String get_library_name(String path)
|
||||||
return LexicalPath::basename(move(path));
|
return LexicalPath::basename(move(path));
|
||||||
}
|
}
|
||||||
|
|
||||||
static Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> map_library(String const& filename, int fd)
|
static Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> map_library(String const& filename, int fd, String const& filepath)
|
||||||
{
|
{
|
||||||
auto result = ELF::DynamicLoader::try_create(fd, filename);
|
auto result = ELF::DynamicLoader::try_create(fd, filename, filepath);
|
||||||
if (result.is_error()) {
|
if (result.is_error()) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -136,7 +136,7 @@ static Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> map_library(String c
|
||||||
int fd = open(name.characters(), O_RDONLY);
|
int fd = open(name.characters(), O_RDONLY);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return DlErrorMessage { String::formatted("Could not open shared library: {}", name) };
|
return DlErrorMessage { String::formatted("Could not open shared library: {}", name) };
|
||||||
return map_library(name, fd);
|
return map_library(name, fd, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto resolved_library_name = resolve_library(name, parent_object);
|
auto resolved_library_name = resolve_library(name, parent_object);
|
||||||
|
@ -147,7 +147,7 @@ static Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> map_library(String c
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return DlErrorMessage { String::formatted("Could not open resolved shared library '{}': {}", resolved_library_name.value(), strerror(errno)) };
|
return DlErrorMessage { String::formatted("Could not open resolved shared library '{}': {}", resolved_library_name.value(), strerror(errno)) };
|
||||||
|
|
||||||
return map_library(name, fd);
|
return map_library(name, fd, resolved_library_name.value());
|
||||||
}
|
}
|
||||||
|
|
||||||
static Vector<String> get_dependencies(String const& name)
|
static Vector<String> get_dependencies(String const& name)
|
||||||
|
@ -559,7 +559,7 @@ void ELF::DynamicLinker::linker_main(String&& main_program_name, int main_progra
|
||||||
|
|
||||||
// NOTE: We always map the main library first, since it may require
|
// NOTE: We always map the main library first, since it may require
|
||||||
// placement at a specific address.
|
// placement at a specific address.
|
||||||
auto result1 = map_library(main_program_name, main_program_fd);
|
auto result1 = map_library(main_program_name, main_program_fd, main_program_name);
|
||||||
if (result1.is_error()) {
|
if (result1.is_error()) {
|
||||||
warnln("{}", result1.error().text);
|
warnln("{}", result1.error().text);
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
|
|
|
@ -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)
|
Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> DynamicLoader::try_create(int fd, String filename, String filepath)
|
||||||
{
|
{
|
||||||
struct stat stat;
|
struct stat stat;
|
||||||
if (fstat(fd, &stat) < 0) {
|
if (fstat(fd, &stat) < 0) {
|
||||||
|
@ -49,20 +49,21 @@ Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> DynamicLoader::try_create(i
|
||||||
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", filename) };
|
||||||
|
|
||||||
String file_mmap_name = String::formatted("ELF_DYN: {}", filename);
|
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());
|
||||||
if (data == MAP_FAILED) {
|
if (data == MAP_FAILED) {
|
||||||
return DlErrorMessage { "DynamicLoader::try_create mmap" };
|
return DlErrorMessage { "DynamicLoader::try_create mmap" };
|
||||||
}
|
}
|
||||||
|
|
||||||
auto loader = adopt_ref(*new DynamicLoader(fd, move(filename), data, size));
|
auto loader = adopt_ref(*new DynamicLoader(fd, move(filename), data, size, filepath));
|
||||||
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)
|
DynamicLoader::DynamicLoader(int fd, String filename, void* data, size_t size, String filepath)
|
||||||
: m_filename(move(filename))
|
: m_filename(move(filename))
|
||||||
|
, 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)
|
||||||
|
@ -236,7 +237,7 @@ Result<NonnullRefPtr<DynamicObject>, DlErrorMessage> DynamicLoader::load_stage_3
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __serenity__
|
#ifdef __serenity__
|
||||||
if (set_mmap_name(m_relro_segment_address.as_ptr(), m_relro_segment_size, String::formatted("{}: .relro", m_filename).characters()) < 0) {
|
if (set_mmap_name(m_relro_segment_address.as_ptr(), m_relro_segment_size, String::formatted("{}: .relro", m_filepath).characters()) < 0) {
|
||||||
return DlErrorMessage { String::formatted("set_mmap_name .relro: {}", strerror(errno)) };
|
return DlErrorMessage { String::formatted("set_mmap_name .relro: {}", strerror(errno)) };
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -344,7 +345,7 @@ void DynamicLoader::load_program_headers()
|
||||||
FlatPtr ph_end = ph_base + round_up_to_power_of_two(region.size_in_memory() + region.desired_load_address().get() - ph_base, PAGE_SIZE);
|
FlatPtr ph_end = ph_base + round_up_to_power_of_two(region.size_in_memory() + region.desired_load_address().get() - ph_base, PAGE_SIZE);
|
||||||
|
|
||||||
StringBuilder builder;
|
StringBuilder builder;
|
||||||
builder.append(m_filename);
|
builder.append(m_filepath);
|
||||||
if (region.is_executable())
|
if (region.is_executable())
|
||||||
builder.append(": .text");
|
builder.append(": .text");
|
||||||
else
|
else
|
||||||
|
@ -396,7 +397,7 @@ void DynamicLoader::load_program_headers()
|
||||||
MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED,
|
MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
String::formatted("{}: .data", m_filename).characters());
|
String::formatted("{}: .data", m_filepath).characters());
|
||||||
|
|
||||||
if (MAP_FAILED == data_segment) {
|
if (MAP_FAILED == data_segment) {
|
||||||
perror("mmap writable");
|
perror("mmap writable");
|
||||||
|
|
|
@ -42,7 +42,7 @@ 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);
|
static Result<NonnullRefPtr<DynamicLoader>, DlErrorMessage> try_create(int fd, String filename, String filepath);
|
||||||
~DynamicLoader();
|
~DynamicLoader();
|
||||||
|
|
||||||
String const& filename() const { return m_filename; }
|
String const& filename() const { return m_filename; }
|
||||||
|
@ -83,7 +83,7 @@ public:
|
||||||
DynamicObject const& dynamic_object() const;
|
DynamicObject const& dynamic_object() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DynamicLoader(int fd, String filename, void* file_data, size_t file_size);
|
DynamicLoader(int fd, String filename, void* file_data, size_t file_size, String filepath);
|
||||||
|
|
||||||
class ProgramHeaderRegion {
|
class ProgramHeaderRegion {
|
||||||
public:
|
public:
|
||||||
|
@ -135,6 +135,7 @@ private:
|
||||||
ssize_t negative_offset_from_tls_block_end(ssize_t tls_offset, size_t value_of_symbol) const;
|
ssize_t negative_offset_from_tls_block_end(ssize_t tls_offset, size_t value_of_symbol) const;
|
||||||
|
|
||||||
String m_filename;
|
String m_filename;
|
||||||
|
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 };
|
||||||
void* m_file_data { nullptr };
|
void* m_file_data { nullptr };
|
||||||
|
|
|
@ -336,7 +336,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);
|
auto result = ELF::DynamicLoader::try_create(fd, path, 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