问题标签 [linker-scripts]

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 投票
2 回答
28670 浏览

gcc - 如何正确使用简单的链接器脚本?可执行文件在运行时获得 SIGKILL

我试图了解更深层次的链接过程和链接器脚本...查看 binutils 文档,我发现了一个简单的链接器脚本实现,我通过添加一些命令对其进行了改进:

我的程序是一个非常简单的程序:

现在我尝试构建一个可执行文件:

但是如果我尝试运行它会在启动期间prog收到一个。SIGKILL我知道当一个程序被编译并与命令链接时:

最终的可执行文件也是其他目标文件的产物,crt1.o但我的情况呢?使用此链接器脚本的正确方法是什么?crti.ocrtn.o

0 投票
2 回答
4549 浏览

ld - 链接描述文件加载与虚拟地址

我有以下链接器脚本,它应该链接代码以在基于闪存的微控制器上运行。uC 在地址 0x0 处有闪存,在 0x40000000 处有 RAM。我想将数据部分放入闪存,但链接程序以便在 RAM 中完成对数据部分的访问。关键是,当控制器启动时,我将手动将其从闪存复制到正确的 RAM 位置。

如上所示的代码生成以下输出:

它表示形式的数组

问题是它链接到 0x40000000,而不是我想要的闪存区域。我希望链接器脚本的 AT>flash 部分指定链接到闪存,如 LD 手册中所述。

http://sourceware.org/binutils/docs/ld/Output-Section-Attributes.html#Output-Section-Attributes

这是我的 ld 调用:

谢谢。

0 投票
3 回答
21074 浏览

linker - 链接描述文件中的对齐

ALIGN 关键字在链接描述文件中的作用是什么?我阅读了许多有关链接器脚本的教程,但我无法理解 ALIGN 的真正作用。谁能简单解释一下。谢谢!

0 投票
1 回答
4439 浏览

ld - 如何使用 GNU ld 创建一个空白部分?

我正在研究 Cortex-M3 芯片。堆栈空间在源代码中保留,在 bss 部分有一个未初始化的数组。我使用的链接器脚本如下:

我正在尝试在 SRAM 区域的开头为堆栈分配一个部分,以便我可以检测到使用错误的堆栈溢出。

我添加了一个名为 .stack 的部分:

链接完成时没有任何错误或警告,但问题是 __stack_end 不在 SRAM 区域上,而是在 FLASH 区域上。

我知道我可以使用 __attribute__((section("name"))) 给出的单独部分,但我认为如果我可以在链接器脚本中处理它会更好。

如何在 SRAM 区域上创建一个空白部分?

0 投票
2 回答
7170 浏览

compilation - 关于链接描述文件创建和验证的建议

长话短说。我希望学习如何创建一个好的链接器脚本,这样如果我改变平台/架构/供应商,我就不会再因为不知道该怎么做而陷入零基础。我不关心任务的难度,只关心理解它。

我已经开始了一个项目,可以说是创建一个基础或框架,用于在 STM 的 32 位 Cortex-M3 芯片上进行编程和开发。在jsei97的帮助下,从 STM32F103RB 开始(我也有一个 TI Stellaris LM3S828,但这是另一个问题),无需许可 IDE。由于我是学生,大多数学生买不起这样的东西。

我知道有 ODev 和 Eclipse 插件等等,并且已经阅读了各种博客、wiki、文档/手册页,并且大多数项目都为您提供了一个链接器脚本,几乎不知道为什么以及在何处定义了事物。

我已经为 STM32 编译了一个 arm-none-eabi 工具链,但我被挂断的地方是链接器脚本。CodeSourcery 也需要一个。在阅读 gnu 手册页后,我对如何创建它们及其语法有了一个基本概念,但除了明显的 .text、.bss 和 .data 之外,我根本不知道从哪里开始添加各种额外的部分.

我创建了一个基本版本,但出现链接错误,要求提供部分定义,这就是我卡住的地方。我知道如何定义它们,但知道我所做的是否接近正确是问题所在。

0 投票
1 回答
986 浏览

vim - 默认 GNU 链接器脚本名称,以便 VIM 进行语法高亮

链接描述文件的通常后缀是什么,以便 VIM 对其使用语法高亮显示?

0 投票
2 回答
5938 浏览

linker-scripts - ' __exidx_start' 和 '__exidx_end' 他们是做什么的?

您好,我有一个链接器脚本,在其中我找到了此代码“ __exidx_start = .;”,它将标签值设置为位置计数器“ .”的值。此标签不在同一链接描述文件中的任何地方使用。

在第一行下面有一个类似的标签定义了几行,它的定义方式相同“ __exidx_end = .;”。

这两个标签是.text.rodata部分的边界,但我不知道如果链接描述文件中没有使用它们,为什么会有人定义这两个标签?

0 投票
2 回答
651 浏览

linker - 在链接描述文件中定义符号有什么用?

我想知道在链接描述文件中定义符号有什么用。使用链接描述文件来安排不同的部分是可以理解的,但我不清楚在脚本中定义新符号。我正在阅读一篇文章,该文章使用定义两个新符号的链接器脚本,但在链接器脚本或文章中的其他任何地方都没有引用这些符号。一个示例是在 bss 部分中使用 sbss 和 ebss 符号,如下所示:

还有其他经常使用的符号,例如 etext , dataEnd 等。请解释在脚本中没有引用它们时定义这些符号的用途。

0 投票
3 回答
37715 浏览

linker - 链接描述文件中的 KEEP 是什么意思?

LD 手册没有解释该命令KEEP的作用。下面是来自第三方链接器脚本的片段,该脚本具有KEEP. 该KEEP命令在做ld什么?

0 投票
1 回答
13034 浏览

gcc - GNU LD:如何覆盖使用 -T 指定的链接描述文件定义的符号值(地址)

我的用例如下:

  • 我正在使用基于 Makefile 的项目附带的典型 SDK
  • 我相信链接器已修补 gcc。gcc --version 给我 4.3.4
  • SDK 定义了链接器脚本(我们称之为 Linker.ld)
  • Linker.ld 包括 LinkerMemMap.cfg,它定义了链接的 ELF 映像中各个部分的绝对地址
  • SDK 提供基于 Makefiles (GNU Make 3.81) 的应用程序模板,并自行制作
  • 在 SDK 提供的 Makefile 模板中,当调用gcc时,Linker.ld 提供了 -T 命令行选项,如下所示:

gcc $(OBJS) -l$(Lib1) -l$(Lib2) -nostdlib -lgcc -L$(library_path) -g -msmall-mode -mconst-switch-tables -mas-mode -mno-initc -Wl,--start-group,--end-group,-T,$(PATH_TO_Linker.ld),--gc-sections -o$(OUTPUT).elf

我的要求如下:

  • 我想使用 Linker.ld 中定义的部分,并按照 LinkerMemMap.cfg 使用内存映射,但是调整 LinkerMemMap.cfg 中定义的特定符号(我们称之为 SYMBOL_RAM_START)

什么有效:

  • 我已经在makefile中尝试过,在链接最终的ELF映像之前,将LinkerMemMap.cfg(包含在Linker.ld中)复制到构建目录并对其进行修补以重新定义SYMBOL_RAM_START。这确实有效,因为链接器首先在当前文件夹中搜索链接器脚本和链接器脚本包含的文件。

什么不:

  • 不幸的是,我们的利益相关者认为上述方法风险太大且太复杂而无法理解。我想用以下内容覆盖链接器命令行上的符号值:

    1. gcc $(OBJS) -l$(Lib1) -l$(Lib2) -nostdlib -lgcc -L$(library_path) -g -msmall-mode -mconst-switch-tables -mas-mode -mno-initc -Wl,--start-group,--end-group,-T,$(PATH_TO_Linker.ld),--gc-sections,--defsym=SYMBOL_RAM_START=$(VALUE_TO_OVERRIDE) -o$(OUTPUT).elf

    2. gcc $(OBJS) -l$(Lib1) -l$(Lib2) -nostdlib -lgcc -L$(library_path) -g -msmall-mode -mconst-switch-tables -mas-mode -mno-initc -Wl,--start-group,--end-group,-T,$(PATH_TO_Linker.ld),--gc-sections --defsym=SYMBOL_RAM_START=$(VALUE_TO_OVERRIDE) -o$(OUTPUT).elf

    3. gcc $(OBJS) -l$(Lib1) -l$(Lib2) --defsym=SYMBOL_RAM_START=$(VALUE_TO_OVERRIDE) -nostdlib -lgcc -L$(library_path) -g -msmall-mode -mconst-switch-tables -mas-mode -mno-initc -Wl,--start-group,--end-group,-T,$(PATH_TO_Linker.ld),--gc-sections -o$(OUTPUT).elf

这些似乎都对链接器创建的链接图像没有任何影响。

  • --defsym 可以覆盖使用 -T 指定的链接描述文件定义的符号吗?
  • 你们中的任何人都可以看看我在这里做错了什么吗?