问题标签 [bfd]

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 回答
4683 浏览

c - GNU Binutils 的二进制文件描述符库 - 格式示例

如标题。我尝试阅读 BFD 的 ELF 代码,但阅读起来并不轻松。我也尝试从文档中获取一些东西,但我需要一个示例来了解它是如何工作的。谁能为我指出一些更简单的例子,以了解如何定义可执行格式?

编辑:看起来我没有正确地提出问题。我不是问“如何创建自己的可执行格式规范?”,也不是“哪里有好的 ELF 文档?”,而是“如何使用 GNU BFD 实现我自己的可执行格式?”。

0 投票
1 回答
3387 浏览

c - 如何合并两个二进制可执行文件?

这个问题是我之前问的另一个问题的后续。简而言之,这是我将两个完全链接的可执行文件合并为一个完全链接的可执行文件的尝试之一。不同之处在于上一个问题涉及将目标文件合并到完整链接的可执行文件,这更加困难,因为这意味着我需要手动处理重定位。

我有以下文件:

example-target.c

example-embed.c

我的目标是合并这两个可执行文件以生成一个最终的可执行文件,它与 相同example-target,但另外还有一个mainand func1

从 BFD 库的角度来看,每个二进制文件都由一组部分组成(除其他外)。我遇到的第一个问题是这些部分有冲突的加载地址(这样如果我要合并它们,这些部分就会重叠)。

我为解决这个问题所做的就是以example-target编程方式进行分析,以获取加载地址列表和每个部分的大小。然后我做了同样的事情example-embed并使用这些信息来动态生成一个链接器命令example-embed.c以确保它的所有部分都链接在不与example-target. 因此example-embed,在这个过程中实际上完全链接了两次:一次是为了确定它们有多少个部分和它们的大小,再一次是为了保证没有部分与example-target.

在我的系统上,生成的链接器命令是:

(请注意,我在部分名称前加上.newusingobjcopy --prefix-sections=.new example-embedobj以避免部分名称冲突。)

然后我写了一些代码来生成一个新的可执行文件(从书本上借了一些代码)objcopySecurity Warrior新的可执行文件应该有:

  • 的所有部分example-target和所有部分example-embed
  • 一个符号表,其中包含来自的所有符号和来自的example-target所有符号example-embed

我写的代码是:

总结这段代码的作用,它需要 2 个输入文件 (ibfdembedbfd) 来生成一个输出文件 ( obfd)。

  • 复制 format/arch/mach/file 标志和起始地址 from ibfdtoobfd
  • 定义从ibfdembedbfd到 的部分obfd。部分的填充是单独发生的,因为 BFD 要求在开始填充之前创建所有部分。
  • 将两个输入 BFD 的私有数据合并到输出 BFD。由于 BFD 是多种文件格式之上的通用抽象,因此不一定能够全面封装底层文件格式所需的一切。
  • 创建由 和 的符号表组成的组合符号表,ibfd并将embedbfd其设置为 的符号表obfd。此符号表已保存,以便以后可用于构建重定位信息。
  • 将部分从 复制ibfdobfd。除了复制部分内容外,此步骤还涉及构建和设置重定位表。

在上面的代码中,有些行被注释掉了/******** */。这些行处理example-embed. 如果它们被注释掉,会发生什么obfd只是简单地构建为ibfd. 我已经对此进行了测试,并且效果很好。但是,一旦我将这些行评论回来,问题就会开始出现。

对于完全合并的未注释版本,它仍然会生成一个输出文件。可以检查这个输出文件objdump,发现它包含两个输入的所有部分、代码和符号表。但是,objdump抱怨:

在我的系统上,1708ofelf.c是:

elf_dynsymtab是一个宏elf-bfd.h

我不熟悉 ELF 层,但我相信这是读取动态符号表的问题(或者说它不存在)。目前,除非必要,否则我尽量避免直接进入 ELF 层。有没有人能告诉我我在代码中或概念上做错了什么?

如果有帮助,我还可以发布链接器命令生成的代码或示例二进制文件的编译版本。


我意识到这是一个非常大的问题,因此,我想适当地奖励任何能够帮助我的人。如果我能够在某人的帮助下解决这个问题,我很乐意奖励 500+ 奖金。

0 投票
1 回答
101 浏览

compiler-construction - 从不同格式的目标文件生成可执行文件

假设我有两个从 gcc 编译的文件 main.o 和另一个从 MSVC 编译的文件 function.o;是否可以从这些文件中生成可执行文件(通过链接)?这是为 BFS(二进制文件描述符)库设计的吗?我的意思是我可以使用 BFS 来做到这一点吗?如果没有,有没有办法做到这一点?

0 投票
4 回答
11405 浏览

gdb - gdb 在山狮上失败

我试图编译一个 7.x 版本的 gdb 没有任何运气。我对可执行文件进行了代码签名(http://sourceware.org/gdb/wiki/BuildingOnDarwin)。

以下版本存在这些问题。

7.5、7.4、git clone:启动 gbd 时我的应用程序和不同系统库的未知加载命令 0x2a(和其他)。例如,当尝试打印矢量时,我总是得到:找不到“main(int,char**)”的框架基础

7.3(macports 和来自 gdb-website):在启动应用程序时,它无法设置断点并继续运行。

我使用系统llvm-gcc、gcc4.7和svn-gcc4.8编译。有人在 Mountain Lion 上成功安装了 gdb 吗?

0 投票
1 回答
220 浏览

ld - 如何重新定位 bfd 大小符号?

使用 gcc 在 elf 图像中嵌入二进制文件时,有没有办法更改自动生成的_binary_*_size符号的地址?与_binary_*_start_binary_*_end符号不同,这些_binary_*_size符号似乎没有跟随代码的基地址。它们位于 bfd 绝对部分 ( *ABS*) 中。

例如:

我想_binary_foo_bin_size0x80008***而不是0x00000***。(最好不要编写我自己的链接器脚本或使用额外的 objcopy 命令。)

0 投票
0 回答
183 浏览

c - 使用 gaddr2line 时的 BFD 未知命令

我正在尝试使用gaddr2line打印更漂亮的回溯符号版本。我只是backtrace()通过gaddr2line使用popen. 在 linux 下使用addr2line可以正常工作,但由于某种原因,我gaddr2line在 OS X 上使用时遇到奇怪的错误。在 Mac OS 上尝试这个时,我不断收到BFD: ... : unknown load command ... 一些帖子提到 GDB,所以我尝试用自制软件安装它,但那没有没有帮助。

这是我的代码:

这是输出:

0 投票
1 回答
879 浏览

c++ - 如何从 C 中的可执行文件中检索平面二进制文件

如何从可执行文件中的 .text 部分检索二进制块?

我知道 objcopy 可以通过以下方式提供帮助:

但是,如果我可以在使用 BFD 库的函数调用中实现相同的目标,那就更好了。有没有办法使用函数调用来调用 objcopy?

0 投票
2 回答
739 浏览

c - 使用 SUSE Linux 和 C 的静态库链接问题

我尝试编译一些非常简单的 C 代码,以尝试了解静态库的工作原理以及 BFD。

我使用这个 gcc 命令构建了代码,它找不到 libbfd,而 libbfd.a 静态库位于 /usr/lib64 中,我也在本地复制了它,并且给定我在这两个目录中指定了 -L 以查找静态库图书馆,它仍然找不到它:

我搜索和搜索,找不到最有可能是一个非常简单的问题的答案,我提前为我的无知道歉!

0 投票
1 回答
664 浏览

c - 使用 bfd 数据结构的目标文件中的节数

我的问题是关于 bfd 以及以下代码中的部分数量如何工作。bfd 结构的 gdb 调试器中的代码和转储及其中的节结构如下所示。我还包括以下 bfd 和 bfd-> 部分的数据结构定义。我的问题是:为什么当我运行此代码时(可执行文件称为 getsections):getsections getsections.o(因此将其传递给它自己的目标文件) - 为什么部分结构为空白(全为零),如果您查看 bfd- >section_count,它的编号是 4218960?如果使用 Linux 命令:objdump -h getsections.o,它会显示 14 个部分(.text、.data、.bss、.rodata、.debug_info、.debug_abbrev、.debug_loc、.debug_aranges、.debug_line、.debug_str、.评论、.comment.SUSE.OPTS、.note-GNU-stack、.eh_frame)。我' 我已经阅读了我在网络上的 BFD 文档中可以找到的内容,但我不确定我在这里做错了什么,因为我的目标文件结构与您在 objdump 中看到的(14 节)相去甚远。任何帮助表示赞赏。谢谢。

在 number_of_sections() 处设置断点,bfd 的转储会产生以下内容:

abfd->sections 的转储看起来好像什么都没有:

bfd 结构如下所示:

bfd->sections 结构(sec 结构)如下所示:

0 投票
1 回答
219 浏览

c - 从调试符号中获取变量的堆栈偏移量

gcc -g当我用调试信息 ( )构建程序时,gdb能够告诉我函数内局部变量的地址。因此,调试符号必须包含足够的信息来计算这一点(即从 的偏移量ebp),并且由于gdb用于libbfd读取调试符号,我应该也可以。

但是,libbdf的文档似乎对此一无所知。可以libbfd给我这个信息吗?