能否用LLVM链接器或相关工具将文件数据嵌入ELF目标文件?
用LLVM工具将二进制文件嵌入ELF目标文件的实现方法
问题背景
GNU链接器可以通过以下命令将二进制文件(如foo.bin)转换为可重定位的ELF目标文件(如bar.o),方便后续嵌入到最终可执行文件中:
ld --format binary --relocatable -o bar.o foo.bin
请问在采用ELF格式的GNU/Linux系统上,能否通过LLVM链接器或相关工具实现相同操作?若可以,具体如何操作?若不行,这属于功能缺陷还是GNU ld的特性?
解决方案
可以通过LLVM的链接器ld.lld直接实现,这是lld为兼容GNU ld特性而添加的功能,不属于LLVM的功能缺陷,主流LLVM 10及以上版本均支持。
方法一:使用ld.lld直接转换
命令格式与GNU ld几乎一致,只需将ld替换为ld.lld,并简化部分参数:
ld.lld --format=binary -r -o bar.o foo.bin
-r参数对应GNU ld的--relocatable,表示生成可重定位目标文件- 执行后生成的
bar.o会自动导出三个全局符号,方便在代码中引用二进制内容:_binary_foo_bin_start:二进制数据的起始地址_binary_foo_bin_end:二进制数据的结束地址_binary_foo_bin_size:二进制数据的大小(等于_binary_foo_bin_end - _binary_foo_bin_start)
方法二:使用llvm-objcopy手动添加段
如果需要更灵活的段控制,可通过llvm-objcopy实现,但不会自动生成上述符号:
- 先生成一个空的ELF目标文件:
touch empty.c clang -c empty.c -o empty.o
- 将二进制文件内容添加到空目标文件的新段中:
llvm-objcopy --add-section .custom_data=foo.bin --set-section-flags .custom_data=alloc,load,readonly empty.o bar.o
.custom_data是自定义的段名,可根据需求修改alloc,load,readonly设置段的属性,确保其能被加载到内存且只读
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

