小编nit*_*ram的帖子

为什么ld.so是共享对象?

我目前正在编写一个动态链接器,但有一些问题困扰着我。为什么ld.so(系统的动态链接器)是共享对象?为什么它不能只是静态可执行文件(ET_EXEC)?

我尝试在Linux内核的binfmt_elf.c中寻找答案,但据我所知,它清楚地表明您的ELF解释器可以是静态可执行文件。

编辑:我认为我的想法可以总结为:动态链接器可以是简单的ELF可执行文件(ET_EXEC)吗?

binfmt_elf.c.559

/* First of all, some simple consistency checks */
    if (interp_elf_ex->e_type != ET_EXEC &&
        interp_elf_ex->e_type != ET_DYN)
        goto out;
Run Code Online (Sandbox Code Playgroud)

PS:我希望这是正确的地方,我不知道该把它放在这里还是在Unix堆栈交换上。我也很抱歉,如果我的问题很愚蠢,但是没有答案,这会让我发疯。

linux loading elf ld

6
推荐指数
1
解决办法
73
查看次数

查找进程的集合点(struct r_debug)结构?

我正在尝试访问“集合结构”(struct r_debug *)以便找到进程的链接图。但我不断遇到无效地址,我真的不知道发生了什么。

以下是我继续尝试找到它的方法:

1. Get the AT_PHDR value from the auxiliary vector
2. Go through the program headers until I find the PT_DYNAMIC segment
3. Try to access the vaddr of that segment (PT_DYNAMIC) to get the dynamic tags
4. Iterate through the dynamic tags until I find DT_DEBUG. If I get here I should be done
Run Code Online (Sandbox Code Playgroud)

问题是我无法通过步骤 3,因为 PT_DYNAMIC 段的 vaddr 始终指向无效地址。

我究竟做错了什么 ?我需要找到 vaddr 的重定位吗?我查看了 LLDB 来源,但我不知道他们是如何获得地址的。

更新:@EmployedRussian 是对的,我正在寻找一个与位置无关的可执行文件。他的计算搬迁的解决方案效果非常好。

c linux debugging elf debug-symbols

5
推荐指数
1
解决办法
742
查看次数

标签 统计

elf ×2

linux ×2

c ×1

debug-symbols ×1

debugging ×1

ld ×1

loading ×1