问题标签 [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.

0 投票
3 回答
2081 浏览

c - 如何从可执行文件中删除链接库

全部。

有人创建了一个可执行文件。

在这种情况下,我想将 libB.so 合并到 libA.so 中。

所以我创建了 libA.so,它涵盖了 libB.so 提供的所有 API。

然后我必须重新链接到这个库。但我没有 test_bin 的任何来源。

如何在没有任何来源的情况下从可执行文件中删除 libB.so 链接?

可能吗?我只是看看binutils。但我还没有找到它。

请给我一个建议。

0 投票
3 回答
5806 浏览

gcc - gcc 如何找到 as、ld 和其他 binutils 可执行文件?

它们的位置是硬编码到 gcc 代码中还是 gcc 只是调用as并且我们必须as在 PATH 变量中有位置?

在后一种情况下,我们如何创建两个完全独立的 gcc 工具链?我的意思是,如果和都被调用,我们如何gcc-A调用as-Agcc-B调用?as-Bas-Aas-Bas

0 投票
2 回答
247 浏览

gcc - Macos 10.6.8 (Snow Leopard) 上的本机工具链问题

下面是问题的描述。我将其全部标记为代码以避免 StackOverflow 所做的隐式格式化。当我确切地知道自己想如何格式化我的问题时,不得不处理类似 Wiki 的标记语言是非常烦人的。

0 投票
1 回答
560 浏览

python - gnu-binutils-strings utf-8 而不是 utf-16 或 ascii

我注意到 gnu-binutils-strings 可以打印出文件中的 utf-16 内容 - 程序是否可以打印出 utf-8 字符串?如果是这样,哪些论点是合适的?我正在使用 subprocess 的 python 环境中工作,并希望使用 subprocess.Popen 调用将通过管道生成的 gnu-binutils-strings 的输出。

0 投票
1 回答
2463 浏览

solaris - 在 Solaris 上构建 binutils 2.21.1a 时出错

我正在尝试在 Solaris sun4u sparc SunOS 5.10 上从http://ftp.gnu.org/gnu/binutils构建 binutils 2.21.1a。我正在使用 gcc 版本 4.0.2。当我建立这是错误:

我将其添加--disable-werror到配置行以尝试绕过它并希望继续构建。不幸的是,这也不起作用,我在链接时遇到了这个新的相关错误:

我搜索了一个现有问题,但没有发现任何相关问题。有任何想法吗?我更喜欢使用这个版本的 binutils,但是如果你知道在这个平台上可以使用 gcc 4.0.2 构建的版本,请告诉我。

0 投票
2 回答
3864 浏览

assembly - MIPS 程序集不支持“.set noat”吗?

目前,我正在学习 GNU as,并在“info as”中找到了很多有用的信息。

我发现在 MIPS 指定代码中使用了“.set noat”,但是在“info as”中搜索该指令时,我在节点“alpha 指令”中找到了它的解释,但在“MIPS Dependent Features”中没有。为什么?我错过了手册中的内容吗?

TIA

0 投票
2 回答
2047 浏览

linker - MIPS、ELF 和部分链接

我有一个具有复杂构建过程的大型软件项目,其工作方式如下:

  1. 编译单个源文件。
  2. 使用 .将每个模块的部分目标文件链接到另一个 .o 中ld -r
  3. 使用 . 隐藏每个模块中的私有符号objcopy -G
  4. 将模块对象部分链接在一起,再次使用ld -r.
  5. 将模块链接在一起成为一个共享对象。

需要第 3 步才能允许未导出到项目其余部分的模块私有全局变量。

这一切都适用于 ARM 和 IA32。不幸的是,现在我必须在 mips 上运行(特别是用于 Android 的 mipsel-linux-gnu)。并且 MIPS 共享对象 ABI 比其他平台上的复杂得多,而且它不起作用。

发生的事情是第 5 步失败并出现此错误:

这似乎是因为编译器生成 CALL16 重定位以调用另一个编译单元中的函数,但 CALL16 只允许您调用全局符号 --- 由于第 3 步,我们尝试调用的某些符号不是不再是全球性的。

在这一点上,我可以看到几个可能的选项:

  • 说服链接器在步骤 2 将 CALL16 重定位解析为正常的编译单元内 PC 相关调用。
  • 同上,但在第 4 步或第 5 步。
  • 告诉编译器不要为编译单元间函数调用生成 CALL16 重定位。
  • 其他。

恐怕由于外部要求,禁用第 3 步不是一个选项。

我真正非常想做的是生成绝对代码,这些代码在加载时被修补到正确的地址;它更小、更快、简单,而且我们不需要在进程之间共享库。不幸的是,Androiddlopen() 似乎不支持这一点。

目前我已经超出了我的深度。有人有什么建议吗?

这是 gcc 4.4.5(来自 Emdebian),binutils 2.20.1。目标 BFD 是 elf32-tradlittlemips。主机操作系统是 Linux,我正在为 Android 进行交叉编译。

附录

从第 4 步收到这样的警告。

查看第 4 步输入的反汇编,我可以看到编译器生成的代码如下:

GOT16 不是固定到地址的高半部分,并且应该在低半部分后跟一个 LO16 吗?但是代码看起来像是在尝试做一个 GOT 间接。这让我很困惑。我不知道这是否与我之前的问题有关,或者是不同的问题,或者根本不是问题......

更新

显然 MIPS 根本不支持隐藏的全局符号!

我们已经通过修改应该隐藏的符号名称来绕过它,这样没人知道它们是什么。这极大地推动了外部要求,但我通过指出这是获得可交付产品的唯一途径来出售管理人员。

这完全令人毛骨悚然(并且涉及一些令人作呕的makefile工作),所以我宁愿想要一个更好的解决方案,如果有人有一个......

0 投票
3 回答
11738 浏览

assembly - 如何使用 GNU 汇编器 (as) 将汇编文件编译为原始二进制文件(如 DOS .com)格式?

我想在 Windows 中编译这个源代码(它只是一个例子):

当我用 NASM 或 FASM 编译它时,输出文件长度为 2 个字节。但是当我用 GNU 汇编器(as)编译它时,输出文件的长度是 292 字节!

如何使用 GNU 汇编器 (as) 将汇编文件编译为原始二进制文件(如 DOS .com)格式?


为什么我这样做?

我想编写自己的简单操作系统,我用 C 编写代码(不使用任何 C 标准库,甚至 stdio.h 或 math.h)并将其转换为程序集:

然后,我将汇编文件编译为原始二进制文件:

然后我将a.out(汇编程序的输出)重命名为my_os.flp并最终使用 VMWare 启动我的操作系统 :)

0 投票
1 回答
168 浏览

assembly - GAS 是否有任何评估类似于 NASM 的 $ 令牌的东西?

我刚开始组装的道路,第一个“你好,世界!” 我找到的教程http://asm.sourceforge.net/intro/hello.html提供了一种很好的伪动态获取字符串长度以进入系统调用的方法。

这在 nasm 中效果很好,一切都可以毫无疑问地组装、链接和运行。

当我试图找到一种方法在气体中做同样的事情时,问题就来了。

我知道在这种情况下 $ 是一个评估当前装配位置的标记http://www.csie.ntu.edu.tw/~comp03/nasm/nasmdoc3.html#section-3.5

这个表达式 ($ - msg) 可以用gas表示,还是这个nasm独有的语法糖?

0 投票
1 回答
941 浏览

c++ - 在链接时弱定义函数,并测试覆盖

(环境:gcc 4.6、c++11、glibc 2.13、binutils 2.21)

请考虑以下“链接”演示作为背景:

foo.h

foo1.cpp

foo2.cpp

主.cpp

生成文件

我们有一个函数声明如下:

我们对它有多个定义,一个在 foo1.cpp 中,一个在 foo2.cpp 中。

我们将 .cpp 文件编译成 .o 文件:

没问题,main.o、foo1.o 和 foo2.o 都生成了。

情况1

然后我们尝试链接 main.o:

好的,main.o 引用了 foo 但没有链接定义。

案例2

现在我们尝试链接 main.o 和 foo1.o

在 foo1.o 中有一个 foo 的定义,所以它链接没有错误。

案例3

现在我们尝试链接 main.o foo1.o 和 foo2.o

链接器在 foo1.o 和 foo2.o 中找到了 foo 的两个定义,因此它不是随机选择一个,而是快速失败并出现错误并且不链接。

问题

我的问题是:

  1. 是否可以将 foo1.cpp 的 foo 版本(可能带有某种 gcc 属性或编译指示)的定义标记为“弱”?具体意味着我希望案例 1 和案例 2 的行为保持不变,而案例 3 的行为更改为成功链接而没有警告或错误,并且 foo2.cpp 中的 foo 定义被链接(覆盖“弱”定义在 foo1.cpp 中)。

  2. 是否可以在运行时测试(并分配给布尔变量)是否链接了弱版本的 foo 或强版本(显然不执行函数)。即在main中实现一个函数,如下所示。

    /li>

is_weak_linked(foo) 应该在案例 2 中返回 true,在案例 3 中返回 false。