- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在构建类似于问题 How to collect data from different .a files into one array? How to keep sections in .a files with ld script? 中的东西,即在链接时由来自不同对象文件的元素组成的数组。
在我的例子中,有几个数组,每个数组都有自己的部分,.ld_comp_array_*,其中 * 匹配数组的名称。然后我使用 ld --verbose 获取默认链接描述文件,并通过将所有这些部分(排序,以便不同数组的元素不会混合)放入输出部分来修改它:
KEEP (*(SORT_BY_NAME(.ld_comp_array*)))
一切正常。
然后事情变得有点复杂,因为使用此功能的应用程序可能针对各种平台构建 - 到目前为止,我已经成功尝试将 AVR Xmega 作为目标平台,以及 Windows 32 位和 Linux用于单元测试的 32 位和 64 位,并且列表是开放的(不久的将来可能会添加新平台)。
但是,对于每个特定平台,默认链接描述文件与其他平台不同,目前我手动插入 .ld_comp_array* 部分 - 是否有可能以某种方式自动执行?我想到的唯一解决方案是解析默认脚本并粘贴上面的输入部分描述,但这似乎太重了。
如果没有相对简单的解决方案,我可以手动完成它,但我不确定从本地版本的 ld 获取的默认脚本是否会在不同版本的 binutils 上中断。谁能澄清这是否安全?
如果它可以自动完成,是否可以将输入部分规范始终直接“注入(inject)”到 .text 部分,假设数组应该是“不可变的”?
最佳答案
我找到了解决该问题的令人满意的方法。 GNU ld 具有 INSERT 选项,这使得外部支持的脚本不会覆盖默认脚本,而只是在相对于默认脚本中存在的某些部分的位置添加新部分。
所以在我的例子中,传递给链接器的脚本可能很简单:
SECTIONS
{
.rodata.ld_comp_array :
{
*(SORT_BY_NAME(.ld_comp_array*))
}
}
INSERT AFTER .rodata;
有关 INSERT 选项的更多信息:http://sourceware.org/binutils/docs/ld/Miscellaneous-Commands.html#Miscellaneous-Commands
关于c - 将部分注入(inject) GNU ld 脚本; binutils 版本之间的脚本兼容性。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6877922/
我正在关注一个网站 ( http://wiki.osdev.org/GCC_Cross-Compiler ) 来学习如何为不同的架构交叉编译一些代码。因此,第一步是为特定目标下载和编译 Binutil
按照本网站的说明进行操作:http://llvm.org/docs/GoldPlugin.html 从命令: ../binutils/configure --enable-gold --enable-
当我命令“make”时,我收到如下错误: /usr/bin/ld: ../../../lib//liblmi.a(LMInterface.o): unrecognized relocation (0x
我正在尝试按照发现here的说明安装交叉编译器。我正在使用64位版本的Ubuntu 13.10。输入命令配置binutils后,我将得到: Configuring for a x86_64-unkno
我正在尝试从头开始构建 Linux,现在我在 chapter 5.4 ,它告诉我如何构建 Binutils。我有 binutils 2.20 的源代码,但是当我尝试构建它时: time { ./bin
我正在尝试创建尽可能小的 ELF。我创建了一个这样的测试文件(NASM 语法): SECTION .text dd 0xdeadbeef 使用此链接描述文件: SECTIONS { .text
我正在将现有系统从 Windows 移植到 Linux。构建由多个静态库构成。我遇到了链接错误,在 libB 的对象中找不到符号(在 libA 中定义)。链接器行看起来像 g++ test_obj.o
我需要在我的项目中包含一个二进制程序。我使用 objcopy 从二进制文件创建对象文件。目标文件可以在我的程序中链接。 objcopy 创建适当的符号来访问二进制数据。 例子 objcopy -I b
我正在尝试构建 binutils 2.21 源代码并启用调试。我的主要目标是实际调试 objdump。但为了构建它,我想我必须构建整个包。 不幸的是,配置文件上没有调试选项。在配置 CFLAGS 之前
我正在尝试在 Cygwin 环境中安装 binutils。 我的路径一团糟(例如,一行配置的输出是: "checking for ld... (cached) c:/dev/perl/c/bin/..
我有一个由某人编译的 binutils 版本。我需要使用相同的选项重新编译一个新的 binutils。 我知道 gcc -v 打印出配置选项。那么也许有什么方法可以读取 binutils 的构建选项?
看说明书,objdump和 nm具有重叠特征。 你什么时候使用每一个?每个命令的最初目的是什么? 最佳答案 它们没有类似的参数。nm列出文件符号,而 objdump可以显示很多关于文件的不同信息。 o
LLVM 编译器工具链有一个与普通 gcc 兼容的 gcc。使用 llvm-gcc 的优点是可以访问任意目标,这意味着当您尝试编译为随机架构时,正常的 gcc 会说没有这样的目标,比如 mips-ap
我正在开发一个项目,我们的验证测试脚本需要在正在测试的软件版本中定位符号地址。这可用于设置断点或从内存中读取静态数据。我想要创建一个包含符号名称、内存中基地址和大小的映射文件。我们的构建输出一个 EL
我正在尝试通过 macports 在 Lion 上安装 gnu ld。我已经从 macports 安装了 gcc 4.6。但是我需要创建 elf 二进制形式的二进制文件,我将其作为单独的问题发布 he
我在脚本中使用 stat 两次,一次是为了查找文件权限,一次是为了查找文件的大小。 `stat -c %A "$directory/$file"` `stat -c %s "$directory/
TLDR:在 gcc 的跨 native 构建中出现 fatal error “无法获得处理时间”。我可以从 gcc.c 中删除 report_times 代码还是使用 gcc 命令行选项禁用 rep
我正在致力于优化单个 C 目标文件的占用空间。我使用编译器 arm-elf-gcc,因为目标平台适用于 ARM-926EJ 处理器。 我想记录当前大小,然后在优化后进行比较,我想知道为什么arm-el
当我运行 make binutils/readelf 时,出现以下错误: In file included from readelf.c:43:0: sysdep.h:23:25: fatal err
我正在编写一个脚本,使 uClibc 可用于现有的以 glibc 为目标的 gcc/binutils 工具链,而我留下的一个问题是 pthread_cancel 需要 dlopen libgcc_s.
我是一名优秀的程序员,十分优秀!