复制自http://wiki.debian.org/Multiarch/LibraryPathOverview:
请求对象的(已弃用的)DT_RPATH 动态标记中指定的任何目录,或者递归地任何父对象(请注意,如果 DT_RUNPATH 也存在,则忽略 DT_RPATH)
我似乎无法在任何地方找到动态标签的定义。
当谈到 ELF 时,两种附带的调试格式非常受其他人欢迎,即STAB 和 DWARF。我想要一种简单的方法来确定给定的二进制文件是否包含一种形式或另一种形式的调试信息,最好不需要检查节名称(.stab 等)。
实现这一目标的好方法是什么?
我目前正在研究 ELF 格式。我想确认一下我认为正确的事情。
ELF是一种格式,它代表可执行和可链接格式。在linux中,一切都是ELF格式。
当使用gcc编译带有-c和-fPIC文件的代码时,它会将代码转换为ELF格式的.o文件。
如果我说 .o/.so 和 linux 可执行文件是 ELF 文件,是否正确?或者 ELF 是 .o/.so 文件中的东西?换句话说,ELF 是 .o/.so 的子集还是 ELF 基本上是整个 .o/.so?
我想确认这一点,因为我想确保我理解这一点。抱歉问了一个愚蠢的问题。
我是操作系统的初学者。这个问题是我的教授提出的,让我很困惑。我希望我能在这里得到一些提示和帮助。
在我的记忆中,ELF文件是可以相互链接的。这是 ELF 文件不能有堆栈段的原因吗?
非常感谢您的帮助!
这个问题让我很困惑。据我所知,.bss部分用于保存已初始化但尚未使用的数据。但我不明白这里的“内容”是什么意思,为什么这里没有内容?
感谢您的帮助!
我试图拦截所有动态加载的函数,这些函数使用openat库comm.so使用LD_PRELOAD机制调用系统调用。
考虑以下/sbin/depmod命令的使用:
#strace -f /sbin/depmod 3.10.0-693.17.1.el7.x86_64
Run Code Online (Sandbox Code Playgroud)
(...)
openat(AT_FDCWD, "/lib/modules/3.10.0-693.17.1.el7.x86_64", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
Run Code Online (Sandbox Code Playgroud)
我想拦截调用此系统调用的函数openat。
如何找出该功能是什么? openat,这可能是一个别名,以及任何其他类似的函数,都不起作用 - 没有任何内容被拦截。
我尝试使用此命令来查找我的命令正在使用哪些动态加载的函数:
#readelf -p .dynstr /sbin/depmod
Run Code Online (Sandbox Code Playgroud)
这会打印出一些.so库,所以我readelf递归地使用它们。在递归结束时,我得到了以下包含open和 的函数列表at:
openat
openat64
open_by_handle_at
__openat64_2
Run Code Online (Sandbox Code Playgroud)
这些都不起作用 - 它们不会拦截返回文件描述符 3 的调用。
好的,那么如何找出我还需要拦截哪些其他函数呢?我是否必须一一递归地遍历命令显示的所有函数readelf(有很多)?
我知道两种查找依赖项的方法,
ldd app.out这会为一个简单的应用程序返回此依赖项:
linux-vdso.so.1 (0x00007ffff93f5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f02383a0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0238800000)
Run Code Online (Sandbox Code Playgroud)
并readelf -d app.out | grep NEEDED返回:
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
Run Code Online (Sandbox Code Playgroud)
我想了解为什么输出差异libc.so在两种情况下都是/lib64/ld-linux-x86-64.so.2解释器并且在第一个中是有意义的,但是关于linux-vdso.so.1?哪一个更准确?
我是 ELF 二进制保护的新手。
我想删除节头表以避免调试。
我尝试通过运行 readelf -h 来查找磁盘上的节头表偏移量,并尝试 nop 它们,但它们都是 0。
如何删除节标题表?
提前致谢。
我们知道 .rel.text和.rel.data部分包含链接器需要重定位以生成最终可执行文件的重定位条目。
我的问题是,为什么要区分.rel.text和.rel.data分段?是不是更简洁,我们可以结合.rel.text和.rel.data部分成一个部分(例如.rel)?我们只需要在重定位条目 struct ( Elf64_Rela) 中添加一个位来指示重定位条目是与函数 ( .text) 还是全局变量 ( .data) 相关?
链接器可以输出 ELF 和 MAP 文件。这些文件在嵌入式系统领域尤其重要,因为 ELF 文件通常用于读出变量或函数的地址。此外,ELF 文件由不同的嵌入式测量或分析工具使用。
当我打开一个 MAP 文件时,我可以在其中看到每个全局变量和每个外部函数的以下信息:分配的地址、符号名称、分配的字节、内存单元和内存部分。
另一方面,一旦我打开 ELF 文件,它就是一个二进制文件,不是人类可读的。但是,我使用的一些工具能够读出并解释它。这些工具可以解释 ELF 文件,并获取有关变量/函数的符号名称及其地址的信息,甚至可以显示函数原型。
根据我的理解,ELF和MAP文件基本上包含相同的信息,只是第一个是二进制文件,后一个是文本文件。那么从内容的角度来看,这两个文件之间的实际区别是什么?
先感谢您!