我想重命名目标文件(.o)中的符号,其中的东西可能是与binutils objcopy --redefine-syms工具相当的Mac .
我找不到arm-apple-darwin10-objcopy.我尝试了MacPorts的arm-elf-binutils端口,也试着玩了一下有otool和segedit没有取得多大成功.
有什么想法吗?
在现代linux中,几乎所有对象都被剥离并分成两部分(两个文件).第一个是可执行的,第二个是调试符号,从原始ELF中删除.这样的文件是用
objcopy --only-keep-debug original.elf binary.dbg
mv original.elf binary
objcopy --strip-debug binary
Run Code Online (Sandbox Code Playgroud)
我该如何合并binary和binary.dbg成ELF文件,调试信息?我想重新创建未经剥离的原始二进制文件.它可以不是与原始字节相同的字节到字节,但必须在其中包含调试符号.
PS是的,我知道gnu.debuglink部分,但它不适用于某些调试器(etnus)和反汇编程序(objdump无法恢复符号信息)
我有一个包含了一个ELF 32位x86文件.eh_frame部分,尽管我尝试1将其删除.
我想删除该.eh_frame部分,而不触及其他部分中的任何符号,包括未使用的符号.
strip似乎没有选项--remove-only,它总是最终修改其他部分.
如何在不修改文件中的任何其他内容的情况下删除单个ELF部分?
1正如其他问题中所建议的,我尝试了几种变体gcc-3.4.3 -fomit-frame-pointer -fno-exceptions -fno-asynchronous-unwind-tables -fno-unwind-tables,但该.eh_frame部分始终存在.这可能是因为我必须使用旧的GCC(3.4.3)...源文件本身不包含任何可能需要这些部分的特殊内容:int main() { return 0; }.
第三方提供了fooapp使用共享对象的C++可执行文件libfoo.so.该库还带有一个标题,foo.hpp以便开发人员可以构建其他应用程序:
/* foo.hpp */
namespace foo {
void bar(int a, int b);
// More code below here <--- NOTE!!!
}
Run Code Online (Sandbox Code Playgroud)
这是一个LD_PRELOAD基于标准的功能插入工作流程.
首先,我编写自己的库版本myfoo.cpp,完全反映了以下部分 foo.hpp:
/* myfoo.hpp */
# include <ofstream>
namespace foo {
void bar(int a, int b) {
std::cout << a << "," << b << std::endl;
}
// NOTHING below here <-- NOTE!!!
}
Run Code Online (Sandbox Code Playgroud)
然后我编译我的库libmyfoo.so,看看以下内容:
$ nm libfoo.so -C | fgrep bar
0000000000021fc0 …Run Code Online (Sandbox Code Playgroud) 我想用来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
Run Code Online (Sandbox Code Playgroud)
libtest.a 是用(从Makefile.am中提取)生成的:
SUFFIXES = .txt
.txt.$(OBJEXT):
objcopy --input binary --output elf32-i386 --binary-architecture i386 $< $@
Run Code Online (Sandbox Code Playgroud)
我怎样才能告诉objcopy我们文件名的词干作为链接符号?或者还有另一种解决问题的方法吗?
有没有办法在对象模块中覆盖静态范围的函数?
如果我从这样的东西开始,带有全局符号"foo"的模块是一个调用本地符号"bar"的函数,它调用本地符号"baz"
[scameron@localhost ~]$ cat foo.c
#include <stdio.h>
static void baz(void)
{
printf("baz\n");
}
static void bar(void)
{
printf("bar\n");
baz();
}
void foo(void)
{
printf("foo\n");
bar();
}
[scameron@localhost ~]$ gcc -g -c foo.c
[scameron@localhost ~]$ objdump -x foo.o | egrep 'foo|bar|baz'
foo.o: file format elf32-i386
foo.o
00000000 l df *ABS* 00000000 foo.c
00000000 l F .text 00000014 baz
00000014 l F .text 00000019 bar
0000002d g F .text 00000019 foo
Run Code Online (Sandbox Code Playgroud)
它有一个全球性的"foo"和两个当地人"bar"和"baz".
假设我想编写一些运动条和baz的单元测试,我可以这样做:
[scameron@localhost ~]$ cat barbaz
bar
baz
[scameron@localhost ~]$ …Run Code Online (Sandbox Code Playgroud) 通常的做法是使用调试符号进行编译,然后将二进制文件objcopy分成使用版本可执行文件和带有调试信息的文件(然后将其包装到单独的包中或存储在符号服务器上).
如何在CMake中正确分离调试符号?我只看到了一些讨论和不完整的代码示例.
平台是Linux和GCC.
我有兴趣创建一个外部符号文件,我使用objcopy --add-gnu-debuglink=....
现在我知道如何仅提取调试符号 ( objcopy --only-keep-debug) 以及如何仅去除调试符号 ( objcopy --strip-debug)。
但是,我想删除所有不需要的符号。我知道这可以通过objcopy --strip-unneeded. 调试和不需要的符号是两个不同的类别和两个不同的命令行开关这一事实表明可能存在不重叠的符号。
由于不需要的符号似乎涵盖更多的不仅仅是调试符号,我怕失去这样做(在GNU MAKE)当一些象征性的信息:
stripped/%: %
objcopy --only-keep-debug $@ $@.dbg
objcopy --strip-unneeded $@
objcopy --add-gnu-debuglink=$@.dbg $@
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释哪些符号可以通过--strip-unneeded不能被删除的符号被删除--strip-debug?或者换句话说:在原始二进制文件上--only-keep-debug运行时,哪些未保存在外部符号文件中的符号可能会丢失--strip-unneeded?有没有办法将这些符号保留在我的外部符号文件中,或者这不是问题?
目标是能够使用外部调试符号来调试问题,而不至于丢失一些符号信息而发现为时已晚。所以我不想丢失符号信息,我只想从程序二进制文件中完全删除它。
PS:我知道如何在构建目标之外生成 gcc 调试符号?但是这个问题及其答案并没有触及我所询问的细节。
我对此非常陌生,我有 elf 文件input.out,需要从中创建十六进制可执行文件。我正在使用 objcopy 创建 intel 十六进制格式的可执行文件,如下所示
objcopy -O ihex input.out out.hex
Run Code Online (Sandbox Code Playgroud)
通过这个 out.hex 包含来自所有部分(.interp、.note.ABI-tag 等)的数据,但我不确定可执行文件是否需要所有这些数据。.text 部分足以创建可执行的十六进制,所以我可以按如下方式使用,还是需要更多部分
objcopy -j.text -O ihex input.out out.hex
Run Code Online (Sandbox Code Playgroud)
另外,如果有任何好的参考来详细了解这一点,我无法通过 Goggling 找到太多内容。可能我不知道要搜索什么。
我有一个NASM程序集文件,我正在组装和链接(在Intel-64 Linux上).
有一个文本文件,我希望文本文件的内容出现在生成的二进制文件中(基本上是一个字符串).二进制文件是ELF可执行文件.
我的计划是在ELF文件中创建一个新的只读数据部分(相当于传统.rodata部分).
理想情况下,会有一个工具来逐字添加文件作为elf文件中的新部分,或者是一个逐字包含文件的链接器选项.
这可能吗?