我想使用 ld 的 --build-id 选项来将构建信息添加到我的二进制文件中。但是,我不确定如何在程序中提供此信息。假设我想编写一个程序,每次发生异常时都会写入回溯,以及一个解析此信息的脚本。该脚本读取程序的符号表并搜索回溯中打印的地址(我被迫使用这样的脚本,因为程序是静态链接的并且 backtrace_symbols 不起作用)。为了使脚本正常工作,我需要将程序的构建版本与创建回溯的程序的构建版本相匹配。如何从程序本身打印程序的构建版本(位于 .note.gnu.build-id elf 部分)?
如何从程序本身打印程序的构建版本(位于 .note.gnu.build-id elf 部分)?
您需要阅读ElfW(Ehdr)
(在文件的开头)在二进制文件中查找程序头(.e_phoff
and .e_phnum
会告诉您程序头在哪里,以及要读取多少个)。
然后你阅读程序头,直到找到PT_NOTE
你的程序的一部分。该段将告诉您二进制文件中所有注释的开头的偏移量。
然后您需要阅读ElfW(Nhdr)
并跳过注释的其余部分(注释的总大小为sizeof(Nhdr) + .n_namesz + .n_descsz
,正确对齐),直到找到带有.n_type == NT_GNU_BUILD_ID
.
一旦你发现NT_GNU_BUILD_ID
注意,跳过它的.n_namesz
,并阅读.n_descsz
用于读取实际 build-id 的字节。
您可以通过将读取的内容与输出进行比较来验证您正在读取正确的数据readelf -n a.out
.
P.S.
如果您要像上面那样麻烦地解码 build-id,并且if您的可执行文件没有被删除,您最好解码并打印symbol名称代替(即复制什么backtrace_symbols
确实)——实际上比解码 ELF 音符更容易,因为符号表包含固定大小的条目。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)