问题标签 [objcopy]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - objdump 和 objcopy 作为 ac/c++ 库
我需要objdump
在 ELF 上执行以获取特定函数和变量的地址和/或大小,objcopy
并将其转换为不同的格式以供以后执行的操作。尤其是第一部分,对结果执行的一些操作objdump
有点复杂,因此我创建了一个小型 C++ 应用程序来执行该操作。它可以工作,但是它当前调用 gccobjdump
并objdopy
直接在调用中包含其参数system
。
我不喜欢这种方法有多种原因,其中一个主要原因是我要么需要依赖用户在 PC 上拥有它们,要么将它们与我自己的可执行文件一起分发并将其视为一种动态库,但在可执行文件的形式,我也不喜欢。
我的问题是,是否有某种形式的(gcc?)库可以(最好是静态地)链接以以这种方式执行相同的操作?我真的更愿意使用与 gcc 类似的东西,特别是在与 gcc 生成的文件作为输入并提供相同输出的兼容性方面,因为我已经拥有我自己的可执行文件的那种版本。
elf - 如何避免 objcopy 炸毁文件?
我objcopy
用来提取/替换某些部分是 Windows 系统上的 ELF 文件。
这通常有效。
但是我的 elf 文件包含调试信息,我需要在交付之前删除这些信息以减小文件大小。
我找到了选项-g
或--strip-debug
应该做我想做的事:
但它失败得很惨。它没有使文件更小,而是在失败之前将文件大小从〜20MB扩大到3GB:
如何使用 objcopy 从 ELF 中正确删除调试信息?
不知道这是否重要,但 objcopy 对 ELF 中的大多数部分发出一些警告,如下所示:
bazel - How to invoke CROSSTOOL tools from Bazel macros / rules?
I'm building ARM Cortex-M firmware from Bazel with a custom CROSSTOOL. I'm successfully building elf files and manually objcopy
ing them to binary files with the usual:
path/to/my/objcopy -o binary hello.elf hello.bin
I want to make a Bazel macro or rule called cc_firmware
that:
- Adds the
-Wl,-Map=hello.map
flags to generate a mapfile - Changes the output elf name from
hello
tohello.elf
- Invokes
path/to/my/objcopy
to convert the elf to a bin.
I don't know how to get the name of a CROSSTOOL tool (objcopy) to invoke it, and it feels wrong to have the rule know the path to the tool executable.
Is there a way to use the objcopy that I've already told Bazel about in my CROSSTOOL file?
arm - 如何将二进制固件转储转换为 .elf 以进行汇编语言调试?
我有一个我知道应该在 0x20000000 加载的 ARM Cortex M 的二进制固件映像。我想将其转换为可用于使用 gdb 进行汇编级调试的格式,我认为这意味着转换为 .elf。但是我还没有弄清楚如何向 .elf 添加足够的元数据来实现这一点。这是我到目前为止所尝试的。
我是否需要首先将二进制文件转换为 .o 并编写一个简单的链接器脚本?我应该向 objcopy 命令添加架构选项吗?
debug-symbols - 分离符号并同时剥离不需要的符号
我有兴趣创建一个外部符号文件,我使用objcopy --add-gnu-debuglink=...
.
现在我知道如何仅提取调试符号 ( objcopy --only-keep-debug
) 以及如何仅去除调试符号 ( objcopy --strip-debug
)。
但是,我想删除所有不需要的符号。我知道这可以通过objcopy --strip-unneeded
. 调试符号和不需要的符号是两个不同的类别和两个不同的命令行开关这一事实表明可能存在不重叠的符号。
由于不需要的符号似乎不仅仅包含调试符号,因此我害怕在执行此操作时会丢失一些符号信息(在 GNU make 中):
谁能解释一下哪些符号可以通过--strip-unneeded
that may not be removed with 来删除--strip-debug
?或者换一种说法:在原始二进制文件上运行时,哪些未保存在外部符号文件中的符号--only-keep-debug
可能会丢失?--strip-unneeded
有没有办法将这些符号保留在我的外部符号文件中,或者这不是问题?
目标是能够使用外部调试符号来调试问题,而不至于错过一些符号信息而发现为时已晚。所以我不想丢失符号信息,我只想从程序二进制文件中完全删除它。
PS:我知道如何在构建目标之外生成 gcc 调试符号?但是这个问题及其答案并没有触及我所询问的细节。
reverse-engineering - 从 dlopen()'ed .so 中丢弃未使用的符号
我有一组仅以二进制形式分发的共享库(英特尔 MKL)。一个顶级“运行时”库libmkl_rt.so
,链接到我的可执行文件,并且通过以下方式可见ldd
:
但是,其他的,例如libmkl_avx.so
,我假设是用 动态加载的dlopen()
,因为可执行文件会抛出一个错误,指出如果找不到库就丢失了,但是用ldd
.
这些库很大(> 100MB),这是我的容器中唯一使用它们的可执行文件。我假设可执行文件没有调用这些库中的每个函数,所以我想精简它们,首先确定正在调用哪些函数,然后只保留这些函数。
我怎样才能:
- 确定动态加载的共享库中实际使用了哪些符号?
- 仅将这些符号提取到库的“超薄”副本中?
有什么工具可以做到这一点吗?
c - objcopy 对静态库的不可预见的后果
背景
我有一组三个几乎相同的静态c库(用 编译-fPIC
),我无法重新编译它们。所有库都导出相同的符号,因此我可以将它们捆绑在一起的唯一方法是通过 为每个静态库修改带有前缀的符号objcopy
,即:
现在,我有三个具有唯一符号的库,并且可以继续编写一个头文件来处理每个库的三个近乎重复的头文件/API 文件。
问题
只是重命名像这样安全的库的导出符号吗?它是否有任何可能导致运行时稳定性问题的“陷阱”或不可预见的后果?库本身中对符号的所有引用是否都会自动更正,或者是否有一些库代码(除了dlsym()
调用之类的东西)会尝试引用旧符号和段错误?
c - 可执行文件有什么区别?
我有以下 C 程序:
编译、复制和比较的命令:
我已经编译了这个程序并创建了一个可执行文件。然后,我使用该objcopy
命令制作了可执行文件的副本。但是,当我比较这些文件时,我得到了这个:
文件不同:字节 41,第 1 行
我怎样才能知道缺少哪些内容?
任何帮助或指示将不胜感激。谢谢!
c - 精灵。隐藏已链接 DSO 的导出符号
我有一个已经编译/链接的 DSO 文件,它导出了一些确实必须隐藏的函数。当我尝试将我的代码与该库链接时 - 它会选择那些不需要的符号而不是我自己的符号。我无法访问源代码,因此我无法重建二进制文件并为不需要的东西使用适当的可见性属性。
我在这里看到唯一的一种解决方案 - 将不需要的符号形式GLOBAL
的可见性HIDDEN
直接更改为二进制。进行这种更改的明显工具是objcopy
,但问题是objcopy
没有修改动态符号表的选项,它只能处理常规符号表。
那么有谁知道哪个工具可以让我改变动态符号表中符号的可见性?
cmake - 使用 custom_target 创建的 cmake 目标失败
我正在尝试将自定义目标添加到我的 Cmake 项目中,它将从 .elf 输出 .hex 文件。这是我使用的一段脚本:
建筑最终是这样的:
直接运行:
按预期工作。怎么可能?