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

bfd - 使用 BFD 接口更新目标文件

我必须向现有的目标文件添加一个符号。我目前正在尝试使用 elf32-i386 目标。我尝试以读/写模式打开目标文件:

我在阅读现有的符号表时没有问题。我将它与 objdump 输出进行了比较,这很好。但是当我在现有的 asymbol** 列表中添加一个新符号并尝试通过调用 `bfd_set_symtab(abfd, newsymtab, newsymtab_count) 来设置新符号表时,会返回失败。

查看bfd_set_symtab()定义的 syms.c 文件,似乎允许使用“只写”模式创建的 bfd 对象设置符号。

“+”模式是both_direction。

我无法以写入模式打开目标文件,因为它会清除文件中的现有数据。我只能选择将使用读取模式创建的 BFD 对象复制到使用新输出对象文件的写入模式创建的另一个对象。查看了 BFD 接口,我看不到任何 api 来复制/克隆现有的 BFD 对象。BFD 文档有一个创建符号表的示例程序,但它位于一个新的输出对象文件中。我想更新现有的对象文件。

谁能告诉我们如何使用 BFD 接口为任何一个简单的用例编辑目标文件。

非常感谢!

0 投票
1 回答
505 浏览

c++ - 获取 C++ 应用程序的调用堆栈,包括共享库

我写了一个小函数来在 C++ 中创建一个调用堆栈,使用 bfd 来解析地址。它工作正常,我得到了当前应用程序中所有函数的详细信息(源文件和行),但我没有得到关于我的应用程序中包含的共享库的任何信息。

例如:

如您所见,可执行文件的符号和与应用程序链接的静态对象已正确解析,但高范围内的地址(例如 0x00002b54229ba6d3)未正确解析。这些地址既不是我的应用程序也不是我的共享库文件的一部分。像这样的其他工具addr2line也无法重建该指令的位置。

只要我只打开磁盘上的文件以获取符号(我目前所做的是abfd = bfd_openr("/proc/self/exe", 0);),我就无法使用 bfd 工具解析这些地址,这是有点意料之中的,所以有没有办法获取当前正在运行的进程的 bfd(因此包括共享库的部分)?如果不是:如何获取已加载共享对象及其偏移量的列表,以及如何将这些偏移量与磁盘上的共享对象文件相关联(这样我可以单独加载 .so 文件的 bfd)?

0 投票
1 回答
35 浏览

g++ - 如何将使用 g++ 2.96 的 lib 构建转换为新的 BFD 格式?

我有一个使用 g++ 2.96 版构建的库文件。该库的源代码不可用,也没有原始开发人员的支持。

我想使用最新的 g++ 版本(比如 4.x)将它与我的应用程序链接起来。据我了解,自 gcc veriosn 3.3 起,名称修饰方案已更改。这就是新链接器无法识别旧 lib 文件中的符号的原因。

我在网上做了一些研究,研究了 objcopy、objdump、c++filt 和 nm 等工具,并试图手动查找和解开 lib 文件中的符号,但无济于事。

那么,有没有办法(或工具)将我的旧二进制 lib 文件转换为新的名称修改方案,以便我可以使用更新的编译器链接它?

0 投票
1 回答
234 浏览

c - 使用 bfd 从跟踪中恢复位置信息

我正在使用dladdrfrom libld( http://linux.die.net/man/3/dladdr ) 来跟踪函数调用。这是带有单个跟踪元素的最小示例:

输出:

也就是说,Dl_info具有跟踪的函数名称、它所属的编译文件以及手册页中描述为“命名符号的确切地址”的某个地址( )。0x7f...

这个地址有源文件位置的信息(从哪里调用函数)。事实上,在一些实用程序的帮助下,我可以获得这些信息:

main(给出源文件中定义的确切行)。只要程序是使用该-g选项编译的,它就可以工作。

现在我想要以编程方式提取这些信息。据说,这可以通过 BFD 库实现。

这是我的尝试,基于在此处找到的 BFD 示例:http: //opensource.apple.com/source/X11libs/X11libs-40.2/cairo/cairo-1.8.6/util/backtrace-symbols.c

1)首先我必须定义一个find_addr_sect稍后将被bfd_map_over_sections(通过指针)调用的函数。

2)我将代码直接放在函数内部(这替换了void f()上面的函数。

可悲的是,我被困在这里,因为这个bfd_map_over_sections电话没有做任何事情。我用bfd_map_over_sections错了,为什么?

很抱歉使用 C++,这是一个 C 问题。它缩短了我的大部分代码,我更习惯了。


编辑:我添加了这一行,我可以确认问题的一个线索是节数为零。

0 投票
2 回答
414 浏览

c++ - 让 BFD 库找到类成员函数的位置

我正在使用该函数bfd_find_nearest_line来查找函数的源位置(来自带有调试符号的可执行文件 --compiled with -g)。自然,其中一个参数是指向我要定位的函数的指针:

https://sourceware.org/ml/binutils/2000-08/msg00248.html

在使用了相当多的(纯 C)样板之后,我设法让它与普通函数一起工作(普通函数指针被强制转换为*void)。

例如,这有效:

问题是是否bfd_find_nearest_line可以用来定位类成员函数的源代码。

类成员函数(在这种情况下如果 type int (A::*)())不是函数,尤其不能转换为任何函数指针,甚至不能转换为void*. 见这里:https ://isocpp.org/wiki/faq/pointers-to-members#cant-cvt-memfnptr-to-voidptr

我完全理解这背后的逻辑,但成员函数指针是我获得成员函数信息的唯一句柄,以便让 BFD 识别函数。我不希望这个指针调用一个函数。

我或多或少知道 C++ 是如何工作的,编译器会默默地生成一个等效的 free-C 函数,

但我不知道如何访问这个自由函数的地址,或者是否有可能,以及bfd库是否能够my_member_function通过这个指针定位原始的源位置。(至少目前我对虚函数不感兴趣。)

换句话说,

1)我需要知道是否bfd能够找到成员函数,

2)如果可以,我如何将类型的成员函数指针映射int (A::*)()bfd可以采用(void*)的参数。


我通过其他方式(堆栈跟踪)知道指针存在,例如我可以得到在这种情况下调用了 free 函数_ZN1A18my_member_functionEv,但问题是我如何从&(A::my_member_function).

0 投票
1 回答
191 浏览

c - 指向函数名、输入参数的指令指针,?

我正在尝试自己实现类似函数调用的回溯。我已经成功地展开堆栈并且我的堆栈上存在所有返回地址。现在我想从这些信息中获取函数名、变量名输入到我的函数中。我也想以编程方式执行此操作,即在运行时我应该能够获取有关到目前为止在我的程序中调用的所有函数的信息。让我们假设我在编译时用 -g 标志编译我的很好。

我正在尝试使用 dladdr() 函数来获取函数名,但这不起作用。它给了我“错误:未知类型名称'Dl_info'”的错误。这是我的代码片段:

我尝试研究 bfd 库,但没有很好的示例/教程,有什么帮助吗?我正在使用 ubunutu 14.04

0 投票
4 回答
567 浏览

c - C中运行时的变量名,函数参数

是否可以在 C 程序运行时知道函数参数和变量的名称类型?例如,如果我有一个功能:

我能知道在这个函数内部abc(),参数和变量的名称是什么,在这种情况下它的x, y, z, a,b它们的类型是int, float, somestruct, char, int

说如果有另一个功能:

我应该知道参数名称是my_struct,index类型是specialstruct, int

我在运行时需要这些信息吗?

我可以访问基指针和返回地址,我可以使用上面的指针获取所需的信息。

我能够使用返回地址和dladdr()函数来提取函数名。

我看到GDB了,所以应该可以提取此信息?

0 投票
0 回答
231 浏览

c - GNU BFD 二进制结果为“没有这样的文件或目录”(二进制未执行)

有一段 C 代码用于从二进制文件中提取信息:

我在 Linux 上针对 2 个 Windows 二进制样本运行了这段代码。但是,其中一个样本导致错误

错误:无法识别文件格式...忽略节标志 STYP_DSECT (0x1)

两个样本上的file命令都会产生以下输出:

fc671a044d48bffe519a89b06d289d83f52958cb:PE32 可执行文件 (GUI) Intel 80386,适用于 MS Windows

fe0c189a5067a2dfe46bad1c2cedaa5b7bbc6a20:PE32 可执行文件 (DLL) (GUI) Intel 80386,适用于 MS Windows

第二个二进制文件 (DLL) 导致错误。我的问题是,为什么会发生这种情况?我能做些什么来解决这个问题?我希望代码也能“看到”DLL 二进制文件。

我将 DLL 二进制文件插入 gdb,实际上 gdb 无法识别该文件。GDB 输出:

...不是可执行格式:文件格式无法识别

编辑 1:添加代码并完成错误消息输出。请注意,我是 C 初学者。

编辑 2:正如评论中所建议的,我已经使用bfd_errmsg(bfd_get_error())并包含了上面的输出。

0 投票
2 回答
2752 浏览

c - 在 ELF 文件中存储和检索版本信息

我试图找出一种在 Linux 上的 C/C++ 可执行文件和库中存储和检索版本信息的好方法。我正在为我的 C 和 C++ 程序使用 GCC 编译器。

存储部分非常简单;声明这样的变量将其存储在输出文件的 .rodata 部分中:

但是,我在从外部程序中检索信息时遇到了难以置信的困难。dlopen使用共享库,使用和加载库和查找符号相当容易dlsym,但这可能不是最好的方法,而且它根本不适用于可执行文件。另外,如果可能的话,我希望它可以与为不同架构构建的可执行文件和库一起使用。

我认为由于共享库和可执行文件都使用 ELF 格式,因此使用知道如何读取 ELF 文件的库是有意义的。我能找到的两个是 libelf 和 BFD;我正在努力为每个人找到合适的文档。是否有更好的库可以使用?

到目前为止,这是我使用 BFD 所拥有的:

我意识到由于 ELF 格式,打印字符串可能不是很简单。

是否有一种直接的方法来打印存储在 ELF 文件中的字符串符号?

0 投票
1 回答
1187 浏览

gcc - 为什么我不能将汇编器输出通过管道传输到标准输出?

[编辑]
这只是我做的一个实验,我想看看我是否可以欺骗内核从一个未命名的管道执行一个精灵,并用 /lib64/ld-linux-x86-64.so 进行进程替换。 2,我知道这是在黑暗中拍摄,但我只是希望看看是否有人可以回答我为什么它不起作用

我认为这可能是由于我得到的结果不同。

所以我在玩 ASM 并注意到您无法将输出组装或链接到标准输出。

给定代码如下:

谁能告诉我为什么不能组装对象或将对象链接到标准输出?请尽可能深入。要查看编​​译器生成该代码的完整过程,您可以使用以下命令:

如果您组装并链接我之前提供的程序集并希望正确执行它,您需要调用 /lib64/ld-linux-x86-64.so.2 /path/to/output 否则它只会说坏精灵解释器.