e27*_*314 6 linux elf backtrace
我想使用ld的--build-id选项,以便将构建信息添加到我的二进制文件中.但是,我不确定如何在程序中提供此信息.假设我想编写一个程序,每次发生异常时都会写一个回溯,以及一个解析这些信息的脚本.该脚本读取程序的符号表并搜索在回溯中打印的地址(我被迫使用这样的脚本,因为程序是静态链接的,并且backtrace_symbols不起作用).为了使脚本正常工作,我需要将程序的构建版本与创建回溯的程序的构建版本相匹配.如何从程序本身打印程序的构建版本(位于.note.gnu.build-id elf部分)?
如何从程序本身打印程序的构建版本(位于.note.gnu.build-id elf部分)?
你需要阅读的ElfW(Ehdr)(在文件的开头)找到程序头在你的二进制文件(.e_phoff并.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字节以读取实际的构建ID.
您可以通过比较您阅读的内容和输出来验证您是否正在阅读正确的数据readelf -n a.out.
PS
如果您要解决上面解释build-id的问题,并且如果您的可执行文件没有被剥离,那么您可能更好地解码和打印符号名称(即复制内容backtrace_symbols) - 它实际上是比解码ELF音符更容易,因为符号表包含固定大小的条目.