问题标签 [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 投票
2 回答
1744 浏览

assembly - 如何从 objdump 中获取信息

读取从 linux 中的可执行文件中转储的信息时遇到问题。信息如下:

我有两个问题:

  1. 地址 804a0ea 和 804a0f4 是什么意思?进程地址空间中的虚拟地址?
  2. 是什么意思?如何在地址 804a0f0 获得指令?

提前致谢。

关于这部分代码的更多信息:

希望任何人都可以帮助我。:-)

0 投票
3 回答
313 浏览

c++ - 给定一个使用 gcc 从 C++ 构建的 ELF 二进制文件,我如何确定其中某些类型的大小?

有没有办法使用 binutils 工具来获得这个?例如:

然后:

如何分析 a.out 以获取 sizeof(MyInt)?GDB 可以做到,但我不想使用 GDB,因为它对于大型二进制文件来说真的很慢。

0 投票
2 回答
6842 浏览

gcc - 如何使用 binutils 链接器处理静态库之间的递归依赖关系?

我正在将现有系统从 Windows 移植到 Linux。该构建由多个静态库构成。我遇到了一个链接错误,在 libB 的对象中找不到符号(在 libA 中定义)。链接器行看起来像

g++ test_obj.o -lA -lB -o 测试

问题当然是当链接器发现它需要来自 libA 的符号时,它已经通过了它,并且不会重新扫描,所以即使符号在那里,它也会简单地出错。

我最初的想法当然是简单地交换链接(到 -lB -lA),以便之后扫描 libA,并拾取 libA 中缺少的 libB 中的任何符号。但后来我发现 libA 和 libB 之间实际上存在递归依赖关系!我假设 Visual C++ 链接器以某种方式处理这个问题(默认情况下会重新扫描吗?)。

我考虑过的处理方法:

  • 使用共享对象。不幸的是,从需要 PIC 编译的角度来看,这是不可取的(这是对性能敏感的代码,丢失 %ebx 来保存 GOT 确实会受到伤害),并且不需要共享对象。

  • 构建一个所有对象的巨型 ar,避免问题。

  • 重构代码以避免递归依赖(这显然是正确的做法,但我正在尝试以最小的更改来完成此端口)。

你有其他想法来解决这个问题吗?有什么方法可以说服 binutils 链接器在缺少符号时重新扫描它已经查看过的库?

0 投票
2 回答
4418 浏览

c - C 编译器在尝试构建 Binutils 时无法创建可执行文件

我正在尝试从头开始构建 Linux,现在我在第 5.4 章,它告诉我如何构建 Binutils。我有 binutils 2.20 的源代码,但是当我尝试构建它时:

它给了我一个错误:

你可以在 pastebin.com 看到我的 config.log:http: //pastebin.com/hX7v5KLn

我刚刚安装了 Ubuntu 10.04,并重新安装了 GCC 并安装了 G++。此外,构建是由一个名为“lfs”的非 root、非管理员用户(在 Linux From Scratch 中也有描述)完成的,并且位于与系统安装位置不同的分区上。

谁能帮我?谢谢

0 投票
2 回答
4129 浏览

linux - 使用 dlopen() 动态加载共享对象

我正在开发一个普通的 X11 应用程序。

默认情况下,我的应用只需要 libX11.so 和标准的 gcc C 和数学库。该应用程序可以通过 Xfixes、Xrender 和 ALSA 声音系统扩展功能。但是,这些(Xfixes、Xrender 和 ALSA)功能是可选的。

为了实现这种行为,我使用运行时加载,即,libXfixes、libXrender 和 libasound 应该是 dlopen()ed。

因此,该应用程序可以在没有此类库的情况下运行。

现在我的问题:

我观察到这些因发行版而异。
例如,在 openSUSE 11 上,它们被命名为:

  • libXfixes.so
  • libXrender.so
  • libasound.so

然而,在 Ubuntu 上,这些名称附有版本号,如下所示:

  • libXfixes.so.3
  • libXrender.so.1
  • libasound.so.2

因此,在 Ubuntu 上尝试打开“libXfixes.so”会失败,尽管 lib 显然在那里。它只是附加了一个版本号。那么我的应用程序应该如何处理呢?
我是否应该让我的应用程序首先手动扫描 /usr/lib/ 以查看我们拥有哪些库,然后选择合适的库?或者有人有更好的主意吗?

多谢你们,

安迪

0 投票
7 回答
1915 浏览

c - 添加函数调用如何导致其他符号在链接时变得未定义?

我希望有人能够帮助解决我认为是链接描述文件的问题。

添加对新函数的调用后,我遇到了一个奇怪的问题。如果没有函数调用,我的目标文件会正确链接,但是,添加新的函数调用后,我会从另一个目标文件中获得对符号的未定义引用(我已经使用 objdump 验证了它实际上存在)。

同样奇怪的是,在存在函数调用的情况下,如果我首先使用 ld -r 链接所有目标文件(以提供可重定位的输出)然后使用我的链接脚本,则没有未定义的引用,但似乎链接脚本被忽略了输出二进制文件没有正确的入口点。

我的(交叉编译器)ld 版本:

> i586-elf-ld --version
GNU ld (GNU Binutils) 2.20.1.20100303

我试图证明存在“缺失”符号的尝试:

> i586-elf-ld -T link.ld -o kernel32.bin kernel_loader.o main.o stdio.o common.o gdt.o gdt.bin -y putch

注意(当我生成这个输出时,我使用的是 gdt.bin 的文件名作为 nasm 编译的汇编器,它只是另一个 .o 文件,真的)

我可以在相应的目标文件中看到“缺失”的符号:

> i586-elf-objdump -ht stdio.o
stdio.o:文件格式 elf32-i386

以及具有未解析引用的目标文件:

> i586-elf-objdump -ht main.o

我的链接脚本(不确定它是否相关):

如果我在 main.c 中注释掉对 putch 的调用,我会得到对 puts 的未定义引用……如果我删除对 gdt_install 的调用,则不会出现错误!

gdt_install 在 C 文件中,但 gdt_install 调用了一个在 gdt.asm 中定义的函数。

为了尝试进一步诊断原因,我一直在尝试重新创建错误。如果我将 gdt_install() 函数调用移动到源代码中的特定位置,我不会收到任何错误并且一切正常:

如果我将调用移到第一个 puts() 调用之上,我会收到未定义的 puts! 引用:

接下来,如果我将调用移到 putch() 之上,它会导致对 putch 的未定义引用(这是我最初调用的地方):

最后,在 init_video() 之上,导致对 init_video 的未定义引用:

到底是什么导致了这个错误?就像 gdt_install 调用以某种方式“破坏”其他符号......我在任何文档中都找不到对它的任何引用,但是 gdt_install 函数调用是否有某种方式可能导致某些链接器“边界”被溢出,破坏其他代码?

有没有人遇到过这样的问题,或者对进一步调查有任何想法?我在 osdev 论坛上发帖:http: //forum.osdev.org/viewtopic.php? f=1&t=22227但运气不佳。

谢谢

编辑:

我不确定它是否相关,但如果我在链接时省略链接脚本,所有以前的错误都会消失......(虽然,我的引导加载程序无法调用内核,因为它不理解 elf 二进制文件)。

根据要求,这是预处理前后的 main.c 文件,并从编译后的 main.o 文件中反汇编。

预处理前:

预处理后:

再次编辑:

感谢 nategoose 建议 -g3 提供更好的反汇编输出:

现在来自一个干净的新输出:

编辑 3

根据要求,这是 stdio.o 上 nm -s 的输出

编辑 4 根据要求,这里是整个源文件。我已将文件以 zip 格式上传到:http ://www.owenstephens.co.uk/media/files/kernel.zip感谢您一直以来的关注和帮助,非常感谢!

生成文件:

链接脚本:

主.c:

常见的.c:

标准输入输出.c:

gdt.c:

gdt.asm:

包括/common.h:

包括/stdio.h:

包括/gdt.h:

“objdump -t”的输出包含所有 .o 文件的共享库(除了 kernel_loader,因此是未定义的 _start 符号。

0 投票
1 回答
1480 浏览

linux - 从 addr2line 获取完整路径

我正在尝试自动化一些调试任务。在某些情况下,我将$ra[this is a MIPS machine] 的值和堆栈的一部分打印为十六进制地址。在调试期间,我使用addr2line将它们转换file:line成对。

我想自动化这个过程。

问题是 addr2line 返回的文件名与__FILE__编译时的值相等;即,传递给编译器的文件名。这通常是foo.c,有时是src/foo.c。由于我的项目总共有数百个目录,这可能不足以唯一标识文件(可能有1/foo.c,2/foo.c等)。即使它是确定性的,在我的屏幕上为每个参数开始运行 find 似乎效率很低[我想我可以构建一个哈希表并保存它们,但我想将其保留为一个简单的 bash 脚本]

GDB 似乎得到了正确的文件。如果我查看带有调试符号的实际源文件,我还可以看到在文件名之后似乎有__FILE__[即,如果__FILE__src/foo.c,并且它真的在/home/me/projects/something/comp1/src/foo.c,我会/home/me/projects/something/comp1在文件中看到的完整路径。我怎样才能以编程方式得到这个?

谢谢。

0 投票
2 回答
5833 浏览

visual-studio - objdump ELF 和 Windows

我对这个主题相当陌生,即 ELF 和任何与 Linux 相关的东西。我正在尝试编写一个 ELF 文件,并且希望在 WinXP 上进行。

我的问题是,这可以用包括编译的 MS Visual Studio 来完成吗?据我了解,ELF 文件无法在 Windows 操作系统上编译。好吧,至少这是我的谷歌研究发现的。我必须设置 Linux 操作系统并在那里编译吗?

我可以使用 objdumo(GNU binutils 的一部分)来分析 WindowsXP 上的任何 ELF 文件吗?

非常感谢任何帮助和链接。

0 投票
3 回答
11479 浏览

macos - Mac / iPhone 的 objcopy 等价物?

我想重命名目标文件(.o)中的符号,它与 Mac 上的 binutilsobjcopy --redefine-syms工具等效。

我发现没有arm-apple-darwin10-objcopy。我尝试了 MacPorts 的arm-elf-binutils端口,也尝试了一些尝试otoolsegedit无论成功与否。

请问有什么想法吗?

0 投票
1 回答
2273 浏览

gdb - gdb\bfd:获取子变量地址或大小或偏移量

我正在使用 gdb 和 libbfd 从 elf 文件中检索全局变量信息并显示它。我可以从 libbfd 获得以下数据:全局变量名称、地址和大小。我使用 gdb 和 gdb\MI(ptype、whatis、-var-create 和 -var-list-children)检索变量及其子项的类型。

如何从所有孩子的父母那里获得地址\大小\偏移量?

例如

如果这种类型的变量 A 在地址 0x000100 中,我想显示 A.count 在 0x000100 中,大小为 0x1,A.time 在 0x000101 中,大小为 0x1。

编辑:我读过 gdb 可以读取 DWARF 信息,但我不知道如何从 gdb 获取这些信息。