问题标签 [elf]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 读取 ELF 文件 DWARF 调试信息的库
有什么好的跨平台库以读取 DWARF 格式的 ELF 文件调试信息的建议吗?我想在 Python 程序中阅读 DWARF 调试信息。
executable - .o 目标文件和 .so 库文件有什么区别?
正如标题所说,“程序对象文件”(.o 扩展名)和“库文件”(.so 扩展名)有什么区别
header - 如何知道 ELF 需要哪些动态库?
是否有任何工具可以读取标头打印 Linux 可执行文件运行所需的动态库的名称?
我需要它知道我刚刚从源代码(它是 GDB 的 Python 分支)构建的二进制文件中是否存在一些奇怪的依赖项(即不是很标准),或者它主要是静态链接的。我认为这比阅读makefile更容易......
c - 任何动手练习,以了解程序如何加载到内存中并执行
我很好奇 main() 被调用之前发生的事情,比如将可执行文件加载到内存中,共享库的动态加载。你对如何通过动手练习来理解这些事情有什么建议吗?
我所知道和现在使用的工具包括:
- 跟踪
- 拆卸
- 自述
- /proc/pid/map
注意:我知道很棒的书籍链接器和加载器,但动手练习可能比阅读本书更能教会我。
c - 初始化后未初始化的全局变量去哪了?
我在学习的时候遇到了一个小问题。我知道 C 中未初始化的全局变量被分配给可执行 ELF 文件中的 .bss 部分。但是当我开始使用它们时它们会发生什么?即,他们是在堆上还是在其他地方占有一席之地?
我试图通过打印(仍未初始化的)全局变量的地址来找出答案
它总是返回相同的值 0x80495bc ...为什么?
c++ - gcc 编译的二进制文件有不同的大小?
如果使用 gcc 在不同时间构建相同的代码,则生成的二进制文件将具有不同的内容。好吧,我对此并不疯狂,但这就是事实。
但是,我最近遇到了这样一种情况,即使用相同版本的 gcc 构建的相同代码生成的二进制文件的大小与之前的构建不同(大约 1900 字节)。
有谁知道可能导致这些情况的原因是什么?这是某种ELF问题吗?是否有任何工具(除了 ldd)可用于转储二进制文件的内容以查看到底有什么不同?
提前致谢。
c - 加载时 ELF 重定位
我正在 Linux 下编写一个简单的用户空间 ELF 加载程序(为什么?为了“有趣”)。目前我的加载器非常简单,旨在仅加载包含与位置无关的代码的静态链接的 ELF 文件。
通常,当一个程序被内核的 ELF 加载器加载时,它会被加载到它自己的地址空间中。因此,数据段和代码段可以加载到 ELF 段中指定的正确虚拟地址。
但是,就我而言,我通过 向内核请求地址mmap
,并且可能会或可能不会获得 ELF 段中请求的地址。这对于代码段来说不是问题,因为它与位置无关。但是,如果数据段未加载到预期地址,代码将无法正确引用存储在数据段中的任何内容。
事实上,我的加载器似乎可以很好地处理一个不包含任何数据的简单程序集可执行文件。但是只要我添加一个数据段并引用它,可执行文件就无法正确运行或 SEGFAULTs。
如果可能的话,我如何修复对数据段的任何引用以指向正确的位置?为此目的,(静态)ELF 文件中是否存储了重定位部分?
c++ - GNU LD 脚本来捕获 C++ 组 / dynsym 部分
我正在维护一个可以将 ELF32 可重定位文件转换为 RDOFF2 格式的工具。
为了使这个过程正常工作,我需要预先链接当前使用 ld 脚本的输入文件,如下所示:
目标是将输入文件减少为仅包含、.text
、.data
、.bss
和.strtab
部分。 .symtab
.shstrtab
虽然当前版本适用于 C 代码,但它在 C++ 中中断,因为g++
/ld
似乎生成了SHT_DYNSYM
以我的一些 C++ 符号命名的类型部分。
我的问题:如何修改提供的链接描述文件来捕捉那些杂散符号?
这是我的示例来源:
objdump -h
(仅有趣的部分)的输出:
同一个文件readelf -S
linux - vmlinux ELF 查找给定结构成员的偏移量
在 Linux 内核中,我需要找到使用的结构的成员变量的偏移量。例如,对于 task_struct 类型的 init_task,我想要它的 pid 和任务的偏移量。
为此,我只有 vmlinux。我可以参考开源内核代码,但它可能与我的构建有所不同。
是否可以在没有源的情况下获得偏移量?
编辑: vmlinux 用于 ARM,我可能并不总是能够在目标设备上运行 C 代码。
java - 将 .so 文件转换为 .jnilib 文件
我有一个.so
在 ELF 格式下为 Linux 编译的库,Java 程序正在使用它。我正在尝试将此应用程序移植到 Mac OS X,并发现 OS X 对这些文件使用不同的扩展名,.jnilib
. 我已经想出了如何设置PATH
它以便正确找到文件。但是,OS X Java 无法加载.so
文件(因为它需要其他扩展名)。
如果我将文件扩展名从 更改.so
为.jnilib
,JVM 可以找到文件但无法读取它们(因为它们已被错误编译)。
在没有源代码的情况下,在 Linux 系统或 Mac OS X 中,有什么方法可以将这些.so
文件转换为.jnilib
? 我怀疑这是不可能的,但 Stack Overflow 还没有让我失望——而且我不会把“这不可能”算作失败。