问题标签 [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.

0 投票
1 回答
166 浏览

c++ - 防止 g++ 添加额外的精灵部分

当使用 g++ 编译时,它为几乎每个函数创建了一个额外的部分。这发生在linux可执行elf64文件上。
举例:

我如何告诉 g++ 在 .text 上发出所有代码,所以只有一个 .text 部分

在没有 -ffunction-sections 的情况下会发生这种情况

而且这些部分甚至在之后仍然存在

====================================================

额外的信息:

0 投票
1 回答
883 浏览

embedded-resource - 使用 objcopy 将文本文件添加到二进制文件,但 objcopy 抱怨架构

我已经阅读了有关将文本文件(或任何其他资源)嵌入二进制文件的信息,我正在这样做:

但是,与教程不同,我得到以下响应:

该示例使用 i386 但这似乎也不是问题,因为我也不能那样做。

有没有办法可以强制 objcopy 忽略它是文本文件而不是有效的兼容二进制文件的事实,所以它只是将它逐字节复制到我的程序中?

0 投票
1 回答
3888 浏览

linux - CMake 保存剥离的调试信息

通常的做法是使用调试符号进行编译,然后将使用的二进制文件分离objcopy到发布可执行文件和带有调试信息的文件中(然后将其包装到单独的包中或存储在符号服务器上)。

如何在 CMake 中正确分离调试符号?我只看到了一些讨论和不完整的代码示例。

平台是 Linux 和 GCC。

0 投票
0 回答
683 浏览

assembly - 使用 gas、ld、objcopy 编译带有绝对寻址的汇编代码

我正在尝试为 MIPS Malta 板编写一些启动代码,在 QEMU 中进行仿真。

据我了解,马耳他板将 4MB 代码从闪存加载到物理 RAM 中的特定位置(0x1fc00000,即 MIPS 程序地址空间中的 0xbfc00000:MIPS32 复位中断位置)。我正在尝试生成将在此位置加载和运行的代码。

我有一个简单的汇编程序,它永远循环:

当我用 GNU 汇编器组装它时,我得到一个带有 .text 部分的 ELF 文件,其中包含这段代码。用 objdump 反汇编它:

使用链接器脚本,我可以将 .text 部分重新定位到 0x8fc00000,此时反汇编会产生:

由于 ELF 文件包含其他不可执行的部分、ELF 标头等,因此我使用 objcopy 仅转储文本部分:

但是,由于分支操作数仍然是相对的,因此生成的代码不使用绝对寻址并分支到 0x0 而不是 0x8fc00000:

我徒劳地搜索了 objcopy 或 ld 的标志,这些标志将输出中的相对地址解析为绝对地址。有 objcopy 标志来操作节起始地址,但我相信这些只会改变输出格式中的偏移表,因此不会影响二进制输出(显然没有这样的表)。

到目前为止,我发现的唯一解决方法是在程序集源中添加 .org 指令:

可以理解的是,这会产生一个以零填充的 ~2GB 文件,但会产生具有绝对寻址的代码,我可以将其删除。

有没有正确的方法来做到这一点?

0 投票
1 回答
49 浏览

linker - 是否可以在另一个操作系统上运行为一个操作系统构建的可执行文件?

我知道 Wine/Darling 和其他兼容层,但我想知道是否有可能(例如)这种方式:
1. 在 OS X 上构建一个简单的 hello_world.c 程序。
2. 使用 objcopy/objconv/其他一些工具,将机器代码复制到 Linux 可执行文件中,并将对 OSX libc 的调用替换为对 glibc 的调用。如果它是另一个动态链接到其他 OSX 库的可执行文件,请复制这些库。
3. 在 Linux 上运行程序,假设它可以工作。
示例hello_world.c

0 投票
2 回答
1948 浏览

xcode - 如何在 Mac OS X 上将二进制文件的内容嵌入到可执行文件中?

我的命令行程序的构建过程会生成一个二进制文件(超过 500KB),当前必须通过来自 argv 的路径来引用该文件。我想将此文件嵌入到可执行文件中。

在 Linux 上,似乎可以使用objcopy从二进制文件生成目标文件:

但是,OS X 开发者工具链不包含 objcopy 命令。没有安装binutils,有什么可能?

我从 Xcode 构建我的项目,并使用自定义构建规则生成文件。

0 投票
0 回答
327 浏览

c - 使用 LD 和 objcopy 从目标文件编织二进制文件

我正在尝试构建一个自定义二进制文件,该文件的数据主要来自一个 .o 文件,该文件由一个大 C 文件编译而成,如下所示:

这个 C 文件基本上包含一大组数据数组,都在同一节中声明。这里有一个重要的注意事项是我不能修改这个 C 文件的内容。

是否可以使用 LD 脚本、objcopy 或任何其他工具以特定顺序(不一定与它们在 C 文件中出现的顺序相同)编织一组输出二进制文件,其中仅包含一个或几个这些变量)?

我尝试为此使用 LD 脚本,但包含的最精细粒度似乎是目标文件的部分。为了实现我想要的,我需要能够直接引用符号。

输出最终将是一个简单的二进制文件(使用objcopy -Obinary生成),仅包含所需数组的串联。所以对于这个问题,我们可以假设我只需要在一个部分中输出所有数据(即没有代码,也没有除了这个大的C文件之外的任何其他输入)。

0 投票
0 回答
546 浏览

c - 创建 ARM flat pic 二进制文件

我想编写一个包含数据的位置相关代码。

这意味着,一个函数可以获取 printf 的绝对地址并打印一个简单的字符串。

我已经设法通过使用带有参数-fPIC的 arm-none-eabi-gcc编译 ELF 来实现这一点。问题是使用objcopy将 ELF 文件转换为平面二进制文件。

objcopy将字符串放在文件的顶部,从而使数据不再独立于位置,而不是将字符串留在函数末尾,由程序计数器寻址。

我错过了什么吗?objcopy 是否可以创建具有位置无关数据的平面二进制文件?

编辑:

可以在附图中看到字符串位于我的函数上方的绝对地址中,而不是在它的末尾并由 PC 指向

0 投票
1 回答
249 浏览

makefile - 将单独的二进制文件包含到 ELF 可执行文件中

我正在开发一个操作系统。我想asm在我的主内核elf中包含一个小程序,它可以作为第一个加载的进程。我无法让这个工作。该程序是initcode.s. 我使用Makefile从 xv6 操作系统源代码修改的以下内容来完成此任务:

内核编译和链接很好。objcopy还创建标记,使我能够从内核代码中找到二进制文件。但是内容initcode被丢弃了。内容与汇编程序步骤中生成的内容不同initcode.out

如何initcode.s在我的 main 中的某个地方包含一个单独的二进制文件,kernel.elf并生成一些标记,以便我可以从我的内核中找到它?有什么建议么?

0 投票
1 回答
148 浏览

c++ - SDL2/SDL_Image 加载 objcopy 文件

如主题所述,我正在使用 objcopy 通过 Eclipse Helios for windows 使用 MinGW 加载 SDL_Image 图像。我正在使用命令:objcopy --input-target binary --output-target pei-i386 --binary-architecture i386 Lilothyn.jpg Lilothyn.o 这导致文件:

... 和另一个:

问题是最后一个文件 (Tommy.o) 正确加载,而第一个文件 (Lilothyn.o) 没有。如您所见,两者看起来很相似。

我的代码很广泛,所以我只会发布相关部分。

源.cpp:

来源.h:

和输出:

请注意,它没有写第二个“getTextureFromJPEGStream!” 它似乎也没有引发异常。它编译没有任何问题,所以 Lilothyn.o 文件是否有可能被创建损坏?(我已经重建了不止一次)和/或链接器可能没有正确链接?执行时,程序在加载第一个图像后停止响应,同时尝试加载第二个图像。感谢您的答复。