gpt4 book ai didi

c++ - objcopy 将目录路径名附加到符号名

转载 作者:可可西里 更新时间:2023-11-01 15:39:30 26 4
gpt4 key购买 nike

我打算使用 objcopy 将文本文件的二进制形式包含到可执行文件中。 (在运行时我需要文件作为字符串)。这工作正常,直到链接器需要从符号名称中找到引用。问题是 objcopy 在符号名称前加上文件的路径名。由于我正在使用 GNU Autotools 来发送包,这个预先设置的路径名发生了变化,我不知道在 C/C++ 程序中使用什么外部链接器符号。

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

libtest.a 是用(从 Makefile.am 中提取的)生成的:

SUFFIXES = .txt
.txt.$(OBJEXT):
objcopy --input binary --output elf32-i386 --binary-architecture i386 $< $@

我如何告诉 objcopy 仅将文件名的主干作为链接器符号?还是有其他方法可以解决这个问题?

最佳答案

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

诀窍是创建模板 .S 文件,看起来像这样:

        .global foo_start
foo_start:
.incbin "foo.raw"

.global foo_end
foo_end:

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

        .incbin __raw_file_path__

...然后在编译的时候传递:

gcc -D__raw_file_path__='"data/foo.png"' foo.S -c -o data/foo.o

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

        .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

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

.global @sym@_start
@sym@_start:
.incbin "@file@"
.global @sym@_end
@sym@_end:

...然后编译它:

sed -e "s,@sym@,passwd,g" -e "s,@file@,/etc/passwd," <foo.S.in | gcc -x assembler-with-cpp - -o passwd.o -c

关于c++ - objcopy 将目录路径名附加到符号名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15594988/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com