首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >objcopy将目录路径名前置为符号名

objcopy将目录路径名前置为符号名
EN

Stack Overflow用户
提问于 2013-03-24 11:53:38
回答 5查看 6.8K关注 0票数 11

我打算使用objcopy将二进制形式的文本文件包含到可执行文件中。(在运行时,我需要字符串形式的文件)。在链接器需要从符号名称中查找引用之前,这种方法工作得很好。问题是objcopy会在符号名称前面加上文件的路径名。因为我使用GNU Autotools来发布这个包,所以前面的路径名发生了变化,并且我不知道在C/C++程序中使用什么外部链接器符号。

代码语言:javascript
复制
nm libtest.a |grep textfile
textfile.o:
00001d21 D _binary__home_git_textfile_end
00001d21 A _binary__home_git_textfile_size
00000000 D _binary__home_git_textfile_start

使用(摘自Makefile.am)制作libtest.a

代码语言:javascript
复制
SUFFIXES = .txt
.txt.$(OBJEXT):
    objcopy --input binary --output elf32-i386 --binary-architecture i386 $< $@

我如何告诉objcopy只告诉我们文件名的词干作为链接器符号?还是有别的办法来解决这个问题呢?

EN

回答 5

Stack Overflow用户

发布于 2013-05-03 16:27:57

颇具讽刺意味的是,您可以通过允许重命名符号的--redefine-sym选项使用objcopy来解决此问题……

如果我使用objcopy从另一个目录中的PNG创建对象文件:

$ objcopy -I binary -O elf64-x86-64 -B i386 --重命名部分.data=.rodata,分配,加载,数据,内容,只读../../ test_png.o /test.png

生成的对象具有以下符号:

$readelf -s test_png.o -W符号表'.symtab‘包含5项: Num:值大小类型Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 SECTION LOCAL DEFAULT 1 2: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 1 _binary_______resources_test_png_start 3: 0000000000003aaa 0 NOTYPE GLOBAL DEFAULT 1 _binary_______resources_test_png_end 4: 0000000000003aaa 0 NOTYPE全局默认_binary_______resources_test_png_size

然后可以对它们进行重命名:

$objcopy --redefine-sym _binary_______resources_test_png_size=_binary_test_png_size $objcopy --redefine-sym _binary_______resources_test_png_start=_binary_test_png_start test_png.o $objcopy --redefine-sym _binary_______resources_test_png_start=_binary_test_png_start test_png.o --redefine-sym _binary_______resources_test_png_end=_binary_test_png_end $objcopy

生成一个具有objcopy将生成的符号名称的对象,如果PNG位于当前目录中:

$readelf -s test_png.o -W符号表'.symtab‘包含5个条目: Num: Value Size类型Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 SECTION LOCAL DEFAULT 1 2: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 1 _binary_test_png_start 3: 00000000003aaa 0 NOTYPE GLOBAL DEFAULT 1 _binary_test_png_end 4: 0000000000003aaa 0 NOTYPE GLOBAL DEFAULT ABS _binary_test_png_size

票数 10
EN

Stack Overflow用户

发布于 2013-08-24 07:42:30

.incbin汇编指令支持将原始数据包含到ELF中的通用方法。

诀窍是创建如下所示的模板.S文件:

代码语言:javascript
复制
        .global foo_start
foo_start:
        .incbin "foo.raw"

        .global foo_end
foo_end:    

这个文件是通过cpp预处理的,所以我们不需要硬编码文件名,例如。我们可以这样写:

代码语言:javascript
复制
        .incbin __raw_file_path__

..。然后在编译时传递它:

代码语言:javascript
复制
gcc -D__raw_file_path__='"data/foo.png"' foo.S -c -o data/foo.o

最后,当我们自己准备.S文件时,我们可以添加一些额外的数据和/或信息。如果您包含原始“文本文件”,并希望这些文件作为C字符串可用,您可以在原始数据后面添加'0‘字节:

代码语言:javascript
复制
        .global foo_start
foo_start:
        .incbin "foo.raw"

        .global foo_end
foo_end:    
        .byte 0

        .global foo_size
foo_size:
        .int foo_end - foo_start

如果你想要完全的灵活性,你当然可以手动预处理文件来改变它的任何部分,例如。

代码语言:javascript
复制
.global @sym@_start
@sym@_start:
       .incbin "@file@"
       .global @sym@_end
@sym@_end:

..。然后编译它:

代码语言:javascript
复制
sed -e "s,@sym@,passwd,g" -e "s,@file@,/etc/passwd," <foo.S.in | gcc -x assembler-with-cpp - -o passwd.o -c
票数 10
EN

Stack Overflow用户

发布于 2014-04-23 22:55:27

我使用的另一个替代方法是cd到源目录,然后给objcopy提供源目录的基本名称。在bash中,这将是:

代码语言:javascript
复制
cd $(dirname $SOURCE)
objcopy ... $(basename $SOURCE) $TARGET

这样,生成的符号始终是不带路径的_binary_file_name_xxx

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15594988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档