问题标签 [binutils]
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.
assembly - 如何在不使用 gcc 的情况下将使用 C 标准库的气体汇编程序与 ld 链接?
作为一个练习,以更准确地了解 c 程序如何工作以及程序必须存在什么最低级别的内容才能使程序能够使用 libc,我自己尝试使用 gas 和 ld 主要在 x86 汇编中进行编程。
作为一个有趣的小挑战,我已经成功地组装和链接了几个链接到不同的自制动态库的程序,但是我无法在不直接使用 gcc 的情况下从头开始编写程序以使用 libc 函数调用。
我了解各个 c 库函数的调用约定,并且已经通过使用 objdump 和 readelf 彻底检查了从 gcc 编译出来的程序,但还没有得到任何地方,至于要在 gas 汇编文件中包含哪些信息以及要调用哪些参数在 ld 中成功链接到 libc。有人对此有任何见解吗?
我在 x86 机器上运行 Linux。
assembly - 带有跳转(和链接)指令的奇怪 MIPS 汇编器行为
所以,我们正在学校学习 MIPS 架构,我们正在实现 MIPS32 架构。我以为我会使用 GNU cross-binutils 作为汇编程序,但是在处理指令 jal、j 和 jr 时我得到了奇怪的输出。汇编器似乎在错误的地方插入了指令。我不知道为什么会发生这种情况,而且我怀疑 MIPS 汇编器会那么坏,所以我认为这应该会发生。
这是我的虚拟程序集文件:
然而,当我反汇编我得到这个输出:
这是一些建筑怪癖吗?如果是这样,这背后的理由是什么?
编辑:测试添加一些 nop 只是为了见鬼......
它给了我一些似乎有些正确的东西。
为什么 jal 和 j 与最后一条指令交换位置?
linux - 如何仅提取 ELF 部分的原始内容?
我尝试了以下方法,但生成的文件仍然是 ELF,而不是纯粹的部分内容。
我只想要该部分的内容。有没有可以做到这一点的实用程序?有任何想法吗?
c - 将代码/符号修补到动态链接的 ELF 二进制文件中
假设我有一个动态链接的 ELF 二进制文件,并且我想覆盖/重定向某些库调用。LD_PRELOAD
我知道我可以用LD_PRELOAD
.
我想做的是从其他目标文件中添加代码(如果需要,可能在新的部分中)并将这些目标文件中的符号添加到二进制的符号表中,以便使用新添加的代码版本代替共享库代码。我相信这应该是可能的,而无需在现有代码中实际执行任何重定位;即使它们在同一个文件中,它们也应该能够在运行时以通常的 PLT 方式解决(值得我只关心函数,而不关心数据)。
请不要给我“你不想这样做!”这样的回答。或“那不是便携式的!” 我正在研究的是一种将二进制文件与稍微 ABI 不兼容的备用共享库实现连接的方法。如果重要的话,有问题的平台是 i386-linux(即 32 位)。除非我弄错了什么是可能的,否则我可以编写一些工具来解析 ELF 文件并执行我的 hack,但我怀疑有一种奇特的方法可以使用 GNU 链接器和其他工具来完成此任务而无需编写新代码。
gcc - Clever uses of linker scripts?
A great comment on my answer describing how to use linker scripts to make a ctor-like function list pointed out that recent GNU ld has much improved support for grafting new sections into system linker scripts with -Wl,-T...
and INSERT BEFORE
/INSERT AFTER
. This got me thinking about other linker script tricks.
For a network card firmware I modified the linker script to group together the runtime modules of the firmware so that they would all be in a contiguous block that could be in L1 cache without conflicts. To clean up stragglers (where I couldn't group by .o
) I used section attributes on individual functions. Performance counters verified that it actually worked (reduced L1 instruction cache misses to almost nothing).
What other clever things have you accomplished with linker scripts?
gcc - 编译静态库时设置较早的最低内核版本
我的发行版(Arch Linux)最近为其工具链增加了最低支持的 Linux 内核版本。我正在编译一个静态链接然后上传到 Web 服务器的 Web 应用程序,而 Web 服务器上的内核版本对于使用新工具链编译的静态库来说太旧了。(当我尝试在服务器上运行静态二进制文件时出现分段错误。)有没有办法使用 GNU 工具链(GCC、binutils、glibc)编译应用程序,从而忽略需要更新内核版本的功能?
c - 为已弃用的函数生成链接时错误
gcc 和 GNU binutils 有没有办法标记一些函数,如果使用它们会在链接时产生错误?我的情况是我有一些库函数,为了与现有二进制文件兼容,我没有删除它们,但我想确保没有新编译的二进制文件尝试使用这些函数。我不能只使用编译时 gcc 属性,因为有问题的代码会忽略我的标头并使用configure
脚本检测函数的存在并自行对其进行原型设计。我的目标是为不良configure
脚本生成链接时错误,以便它们停止检测函数的存在。
编辑:一个想法..使用程序集.type
为入口点指定错误是否与动态链接器兼容,但在尝试链接新程序时会产生链接错误?
shared-libraries - 使用 binutils 创建可重定位共享库
我有一个生成可重定位共享库的自定义工具链。这与一个同样定制的 ELF 加载器一起工作,它将这些加载到内存中,修复它们。我现在正试图说服 gcc 和 binutils 生成与此加载程序兼容的 ELF 文件。
不幸的是,binutils 似乎拒绝生成可重定位的共享对象。它会生成 PIC 共享对象,但我不想这样做,因为 GOT/PLT 的额外开销(此外,自定义 ELF 加载器不支持它)。它会生成可重定位的对象,但它们不是动态对象,因此没有 ELF 加载器希望能够加载它们的适当部分。
我不清楚为什么 GNU ld 拒绝允许我在同一命令行上指定 --relocatable 和 -shared 。任何人都可以启发我吗?有没有人知道让 ld 生成我正在寻找的目标文件的咒语?
gcc - gcc 告诉寄存器从哪个变量编译
我需要知道从哪个变量编译obj文件中的二进制指令的寄存器。
简而言之:每条指令从寄存器到变量的映射
示例:假设 objdump 给出了一个 obj 文件片段:
我们怎么知道 R1 存储了源代码中的变量,比如var1 ?而 R2 存储var2?
我在readelf的文档中进行了搜索,不幸的是徒劳无功。
(虽然它可以为我提供源代码和二进制文件之间的线映射,但它对我没有进一步的帮助)
然后我搜索了一些 gcc 和链接器的调试选项。找到了一些有用的信息,但他们仍然没有解决我的问题。
我找到的信息是:
- 选项-fdump-rtl-vartrack可以跟踪所有变量,似乎很有用。但是在使用此选项进行编译时,我没有找到预期的 *.vartrack 转储文件。
- 选项*fdump-rtl-vartrack-uid显示每个变量的唯一 ID (DECL_UID)。但是我在使用时收到了这个错误:cc1: error: unrecognized command line option "-fdump-tree-uid"
- 选项fdump-rtl-lreg转储本地寄存器分配,但我看不出它如何告诉我从 reg 到变量的映射。
有没有人有一些经验或想法?
谢谢你们!
破解...
android - binutils-gold 是否支持 arm/Android?
我正在尝试arm-eabi-ld
用 installed from替换我的默认值binutils-gold
ld
,但是在链接期间我得到了
LOCAL_CFLAGS := -fPIC
在 Android.mk 中并没有太大帮助。有没有机会使用黄金链接器?