问题标签 [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 投票
1 回答
992 浏览

c - 如何使用这个链接描述文件程序?

如果我在我的 program.c 中编写代码作为全局声明:

我编写以下代码并将其保存为 a.ld:

稍后我将在链接器部分指定 a.ld 的路径。如果我喜欢上面,内存的地址将是固定的??这是正确的做法吗?谁能告诉我如何在 Eclipse 或 Visual Studio C++ ide 中进行链接器设置?

我正在创建一个固定的内存地址,然后使用这个地址存储在主服务器上的文件中。还有其他替代解决方案吗?

0 投票
3 回答
16979 浏览

arm - 什么时候使用 .ARM.exidx

我正在使用 mbxxx 目标开发 Contiki 2.7。在构建我的代码时,链接器抱怨.ARM.exidx 和 .data 部分重叠。在修改了链接器脚本 contiki-2.7/cpu/stm32w108/gnu-stm32w108.ld 后,我通过替换解决了这个问题:

和:

后来,当我尝试使用 objdump -h 查看其他一些示例应用程序的标题列表时,我没有找到这个特定的 .ARM.exidx 部分,而它存在于我的应用程序中。谷歌搜索 .ARM.exidx 让我发现它用于一些 c++ 异常处理。既然我的代码是纯 C 代码,为什么这部分会出现在我的代码中?.ARM.exidx 通常何时出现在代码中,它的用途是什么?

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

不,我没有任何这样的编译器选项。我实际上正在使用 AxTLS api 并撕下证书处理代码并将其移植到 contiki。在进一步的挖掘中,我发现了 bigint 实现中的可疑行为。简而言之……这是 bigint.c 文件中的函数主体:

如果注释掉的部分(r 变量赋值)未注释,则 .ARM.exidx 会出现,否则不会出现!现在可以解释了吗???

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

我没有发现在alloc(). 在代码的某个单独区域中使用了2 个引用alloca(),我将其替换为malloc()and free(),但这也没有解决问题。alloc()实现只调用malloc(),realloc()free()

0 投票
2 回答
513 浏览

c - 如何解决此链接器脚本错误?

我创建了一个链接器脚本文件作为 memory.ld –</p>

我在 linux rtos 上使用 eclipse IDE。我在 Eclipse 中的项目-属性-链接器-库-杂项中添加了-T memory.ld 我创建它是因为:我想要一个固定的内存地址,用于从 0x0041c620 开始的大小为 30 的变量测量值。

我的问题:这样做是否正确?如果我确实喜欢上面的内容:我收到错误 - 链接器输入文件未使用且链接未完成。

注意:我正在重新发布问题。

0 投票
1 回答
1735 浏览

linker - 没有用于 LOAD 的初始化数据的 GNU 链接器标记部分 - 原始二进制巨大

我正在编写一个裸机 ARM 引导加载程序,并尝试使用一些内部 SRAM 作为暂存器与应用程序代码进行通信。对于我的需要,我不需要初始化或归零内存。使用这个脚本,我可以把我想要的变量放在内存中就好了。

当使用 objcopy 创建原始二进制文件时,我得到了巨大的文件。我假设这是因为原始二进制文件的第一个字节实际上是内部存储器,在 .text 部分的开头有几兆字节的填充。Objdump -h 显示 internal_ram 部分被标记有 CONTENTS、LOAD 和 DATA 标志,即使放置在那里的变量没有初始化。

我可以使用 --remove-section=.internal_ram 在 objcopy 中清理它,但似乎应该有一种方法可以让链接器识别出数据未初始化。

有没有办法适当地标记该部分?

0 投票
1 回答
1034 浏览

microcontroller - 如何用代码写stm32w108的闪存

我正在解决一个问题,我需要从 stm32w108 微控制器的闪存中读取和写入一些数据。我正在使用 dizic mb954 板,并在其上运行 contiki。我尝试通过在 .text 部分中添加一个额外的部分 .flash_store 并将(rwx)属性添加到闪存来修改链接器脚本,并使用显式声明一个数组

__attribute__((.flash_store))

问题是虽然我可以正确读取初始化的数组,但在写入时,它会退回到默认处理程序并在那里循环。

在 AVR 微控制器中,这很容易使用 PROGMEM 属性完成,stm32w108 是否有类似的解决方法?

0 投票
1 回答
39 浏览

parallel-processing - 制作应用程序的副本

我正在研究多核处理器。

我想制作一个 AMP 系统,即——我有一个应用程序在 core0 上成功运行,我希望完全相同的应用程序也运行 core1。但是这两个应用程序不会相互交互——就像两个不同的应用程序在不同的内核上运行一样。

我该怎么做?可能的计划是: 1. 将已编译的应用程序复制到 RAM 的不同位置,并将新位置的起始地址提供给 core1 以从那里开始执行。使用链接描述文件。

你们有人试过吗?如果您已经尝试过,那么您能否给我一个示例代码,说明如何为其编写链接器脚本 - 因为我是编译和生成 ELF 文件的新手。我用谷歌搜索了很多天,我只得到了算法,但没有可以从中学习的代码。

谢谢,

P:S - 没有操作系统实现为它唯一需要一直执行的一个线程。并且所有核心都将独立执行它们自己的线程实例。简而言之——所有核心都将执行相同的应用程序,但独立于它的不同实例。

0 投票
1 回答
993 浏览

linker - 产生巨大的输出二进制文件

我正在为飞思卡尔 iMX6 板开发小型 hello world 应用程序,它将从片上 RAM 运行。我可以从 OCRAM 运行完整的代码,但是如果我修改链接描述文件以在外部 DDR ram 的内存空间中生成一个数据段,输出二进制文件的大小会突然从 114 KB 增加到 259 MB。如果该部分是在 OCRAM 中创建的,它就可以正常工作。它肯定与链接有关,但我找不到原因以及如何避免它。以下是链接描述文件中的选定部分:

.
.
.
.ex_ram (ORIGIN(DDR)) : { . = . + 0x10; } > DDR

在我看来,这与 OCRAM 和 DDR ram 地址空间之间的巨大差距有关,但无法纠正!

0 投票
2 回答
81 浏览

linker - How to fail the build based on the conditional values of linker variables defined in linker script?

How to fail the build based on the conditional values of linker variables defined in linker script?

I am compiling C code using GCC. I defined a linker variable BINARY_TEST. If Value of BINARY_TEST > 32KB, then i want to Fail the build. How to write a conditional test and fail the build using linker script? Please suggest any script.

0 投票
1 回答
17868 浏览

c - ELF中程序头和节头的区别

Q1 ELF 中的 Program header 和 Section Header 有什么区别?

Q1.1 段和段有什么区别?

我相信 pheaders 仅指向部分。

Q2。文件头和程序头有什么区别?

根据 GNU ld 链接器脚本,使用 ID:GNU 链接器

您可以使用出现在程序头类型之后的 FILEHDR 和 PHDRS 关键字来进一步描述段的内容。FILEHDR 关键字表示该段应包含 ELF 文件头。PHDRS 关键字意味着该段应包括 ELF 程序头本身。

这有点令人困惑。

0 投票
1 回答
558 浏览

gcc - 链接描述文件中的位置计数器 (.) 更新

我对链接描述文件中的位置计数器有疑问。不知道这是一个错误还是我期待错误的输出。

我有一个 bss 部分

我的问题是(__bss_end - __bss_start)不等于__bss_size. __bss_end如果我改为在该部分之外分配,.bss我会得到预期值。如果我用 elfread 检查节标题,我会得到预期的.bss大小。

我正在使用的链接器是:

和海合会

所以问题是位置计数器(.)是否应该在节定义中更新,还是我只是使用错误?

PS:希望我使用正确的术语...