标签: elf

本文中提到的“动态标签”是什么意思:

复制自http://wiki.debian.org/Multiarch/LibraryPathOverview

请求对象的(已弃用的)DT_RPATH 动态标记中指定的任何目录,或者递归地任何父对象(请注意,如果 DT_RUNPATH 也存在,则忽略 DT_RPATH)

我似乎无法在任何地方找到动态标签的定义。

c linux debian gcc elf

2
推荐指数
1
解决办法
1043
查看次数

如何最好地确定二进制文件是否包含 STAB 或 DWARF 调试信息?

当谈到 ELF 时,两种附带的调试格式非常受其他人欢迎,即STAB 和 DWARF。我想要一种简单的方法来确定给定的二进制文件是否包含一种形式或另一种形式的调试信息,最好不需要检查节名称(.stab 等)。

实现这一目标的好方法是什么?

elf dwarf

2
推荐指数
1
解决办法
1796
查看次数

ELF 格式:ELF 是 .o/.so 的子集还是 ELF 基本上是整个 .o/.so?

我目前正在研究 ELF 格式。我想确认一下我认为正确的事情。

ELF是一种格式,它代表可执行和可链接格式。在linux中,一切都是ELF格式。

当使用gcc编译带有-c和-fPIC文件的代码时,它会将代码转换为ELF格式的.o文件。

如果我说 .o/.so 和 linux 可执行文件是 ELF 文件,是否正确?或者 ELF 是 .o/.so 文件中的东西?换句话说,ELF 是 .o/.so 的子集还是 ELF 基本上是整个 .o/.so?

我想确认这一点,因为我想确保我理解这一点。抱歉问了一个愚蠢的问题。

linux elf

2
推荐指数
1
解决办法
1650
查看次数

为什么对象(ELF)文件中没有堆栈段?

我是操作系统的初学者。这个问题是我的教授提出的,让我很困惑。我希望我能在这里得到一些提示和帮助。

在我的记忆中,ELF文件是可以相互链接的。这是 ELF 文件不能有堆栈段的原因吗?

非常感谢您的帮助!

c operating-system elf

2
推荐指数
1
解决办法
1390
查看次数

为什么对象 (ELF) 文件中的 .bss 部分没有内容?

这个问题让我很困惑。据我所知,.bss部分用于保存已初始化但尚未使用的数据。但我不明白这里的“内容”是什么意思,为什么这里没有内容?

感谢您的帮助!

c operating-system elf

2
推荐指数
1
解决办法
1550
查看次数

如何找出LD_PRELOAD要拦截哪些函数?

我试图拦截所有动态加载的函数,这些函数使用openatcomm.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(有很多)?

linux elf ld-preload

2
推荐指数
1
解决办法
1158
查看次数

获取准确的 ELF 依赖关系

我知道两种查找依赖项的方法, 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?哪一个更准确?

linux process elf linux-kernel ldd

2
推荐指数
1
解决办法
889
查看次数

如何删除 ELF 文件中的节头表?

我是 ELF 二进制保护的新手。

我想删除节头表以避免调试。

我尝试通过运行 readelf -h 来查找磁盘上的节头表偏移量,并尝试 nop 它们,但它们都是 0。

如何删除节标题表?

提前致谢。

linux reverse-engineering elf

2
推荐指数
1
解决办法
3940
查看次数

为什么要区分 .rel.text 和 .rel.data 部分?

下图描述了 ELF 可重定位目标文件的格式: 在此处输入图片说明

我们知道 .rel.text.rel.data部分包含链接器需要重定位以生成最终可执行文件的重定位条目。

我的问题是,为什么要区分.rel.text.rel.data分段?是不是更简洁,我们可以结合.rel.text.rel.data部分成一个部分(例如.rel)?我们只需要在重定位条目 struct ( Elf64_Rela) 中添加一个位来指示重定位条目是与函数 ( .text) 还是全局变量 ( .data) 相关?

c linker gcc elf

2
推荐指数
1
解决办法
717
查看次数

ELF 与 MAP 文件之间的区别

链接器可以输出 ELF 和 MAP 文件。这些文件在嵌入式系统领域尤其重要,因为 ELF 文件通常用于读出变量或函数的地址。此外,ELF 文件由不同的嵌入式测量或分析工具使用。

当我打开一个 MAP 文件时,我可以在其中看到每个全局变量和每个外部函数的以下信息:分配的地址、符号名称、分配的字节、内存单元和内存部分。

另一方面,一旦我打开 ELF 文件,它就是一个二进制文件,不是人类可读的。但是,我使用的一些工具能够读出并解释它。这些工具可以解释 ELF 文件,并获取有关变量/函数的符号名称及其地址的信息,甚至可以显示函数原型。

根据我的理解,ELF和MAP文件基本上包含相同的信息,只是第一个是二进制文件,后一个是文本文件。那么从内容的角度来看,这两个文件之间的实际区别是什么?

先感谢您!

embedded linker elf

2
推荐指数
1
解决办法
433
查看次数