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

assembly - 链接描述文件中的 ORG 汇编指令和位置计数器

据我了解,在程序集(特别是 NASM 程序集)中使用 ORG 指令并将链接器脚本中的位置计数器设置为某个值执行相同的功能。但是我想知道如果我同时使用 org 指令和具有优先权的位置计数器。例如,如果我有一个以开头的汇编代码ORG 0x10000和以开头的链接器脚本

代码将链接到哪个地址?

0 投票
1 回答
1103 浏览

c - 链接描述文件中的位置计数器

我在想我了解链接器脚本中位置计数器的工作原理,但我想并非如此。我只是做了一个简单的测试来确认我的理解。我写了一个没有任何库调用的简单 c 程序,并用 gcc 编译它。然后我使用链接器脚本将其链接起来,并在开始时将位置计数器设置为值。这是程序

以下是链接描述文件

我不想执行它,只是查看 objdump 输出。我在想,当我objdump -s在精灵上做时,它应该将起始地址显示为 0x8048000。但是我总是看到起始地址为 0000

此外还有一个评论部分也是从 0000 开始的。我不明白发生了什么。

这是没有链接描述文件的 objdump 的输出(仍然没有任何库)

0 投票
1 回答
422 浏览

linker - 意外的链接器部分输出位置

我正在尝试ld在内核的程序集文件上使用 linux 中的命令。要使用 grub 启动,它需要位于 1Mb 地址之后。所以我的链接脚本有文本到地址 0x00100000。

这是我正在使用的链接器脚本:

我的问题是关于输出文件。当我查看文件的二进制文件时,文本部分从 0x1000 开始。当我更改脚本中的文本位置并使用低于 0x1000 的地址(例如 0x500)时,文本将从那里开始。但是每当我超过 0x1000 时,它就会将其四舍五入(0x2500 会将文本放在 0x500 处)。

当我指定文本应该在 0x100000 时,它不应该在输出文件中吗?或者二进制文件的另一部分是否指定还有更多工作要做。我问是因为启动我的内核时出现问题,但现在我只是想了解链接器输出。

0 投票
1 回答
1517 浏览

linux-kernel - 链接器脚本浪费了我的记忆

这是我的问题。我有这个链接器脚本链接标准 arm7nommu-uClinux 内核:

我的硬件模拟器的内存架构由一个 sdram 和一个闪存组成。我想拆分我的代码部分,并将(例如)闪存中的 .text 部分和 sdram 中的 .data 部分放在一个特定的地址。为此,我以这种方式修改了我的链接器脚本:

它工作正常,因为所有部分都映射到我想要的位置,但是当正常输出文件(与以前的链接器脚本链接)约为 800Kb 时,输出文件约为 429Mb!...为什么?请帮我!

提前致谢。

0 投票
3 回答
2074 浏览

c - 可执行文件中全局 const 变量的偏移量

想让一个可执行文件通过修改它自己的全局常量来保存它的状态。只是为了拥有一个完全独立的可执行文件。

想到的一些解决方案/黑客:

  1. 使用 libelf 并让程序自行解析以找到偏移量。
  2. 添加一个特定的标记,然后在可执行文件中搜索它。我想这甚至可能有点跨平台?
  3. 使用对象转储工具来确定可执行文件中的地址。这可能需要始终作为项目构建的后处理来完成。

让链接器提供此信息会很好。

是否可以让链接器提供可执行文件中只读部分的偏移量?

谢谢

0 投票
1 回答
229 浏览

assembly - .foo : { *(.*) } 在链接描述文件中是什么意思?

我正在编写一个 512 字节的可引导程序,我必须将 0xAA55 粘贴在我的 512 字节程序映像的最后 2 个字节中。所以我做到了。现在我的链接器脚本应该很简单。我只是好奇这个语法是什么意思

我以它为例。没有 .foo 部分,在此之前,我将程序计数器更改为

所以在这个指令之后

这是做什么的?

0 投票
1 回答
925 浏览

compiler-construction - 如何通过链接器脚本在 i386 链接器中实现 OVERLAY

我正在尝试链接 GDB 参考手册中的 Overlay 示例。该示例针对 d10v 处理器(对它不熟悉),但我想通过编译 x86_64 或 i386 架构的示例来证明调试器可以处理覆盖。

我尝试将以下部分导入链接器脚本。我首先使用从 StackOverflow 学到的技术提取了链接描述文件。

$> gcc a.c -Wl,-verbose

我修改了这个链接器脚本,添加了 .ovly0{0-3} 和 .data0{0-3} 部分,如下所示:

该脚本的相关部分如下:

当我使用此脚本编译程序时,我最终会得到一个运行的可执行对象,但在尝试加载覆盖时会出现 SEGFAULT 。有趣的是,OBJDUMP输出似乎是正确的,两个函数 'foo' 和 'bar' 都被赋予了相同的 VMA 地址(0x1001000)并且每个都有其分配的加载地址。

这是 OBJDUMP 的相关部分:

我真的很想知道是否有人使用过链接器的 Overlay 功能,如果有,是否有人能够对此进行演示?我需要这个用于我正在开发的嵌入式调试器。

我将不胜感激在这方面的任何帮助。

谢谢,

muman613

0 投票
2 回答
2390 浏览

linker - arm loader脚本的含义

我得到了 output_format、output_arch、entry... 可能意味着输出将是 elf32-littlearm 等等。

但是 Sections 部分是我没有得到的。

这个 '。=' 是开始。

和 '。= ALIGN(4)' 和 .text : { *(.text) } ....

谁能帮我解决这个T_T

谢谢阅读。

0 投票
1 回答
11575 浏览

g++ - LD_LIBRARY_PATH 和 -rpath 有什么区别

链接库时,使用-rpath 将动态库的地址传递给ld。我的问题是,如果我在 LD_LIBRARY_PATH 中设置地址,我的链接过程中还需要 -rpath 标志吗?

0 投票
1 回答
1164 浏览

linker - GNU 链接器和链接器脚本:链接器不生成正确的 LMA

我的链接器脚本中有以下行

eROData 是来自闪存的地址,并假定值为 0x1000xxxx

链接后,我注意到链接器将 VMA 和 LMA 都分配给了 JumpTable 部分。这是列表文件中的列表。

.data 部分没有这样的问题。

这是一个已知的 GNU 链接器问题吗?

编辑:我注意到如果在 C 文件中定义了“.JumpSection”部分,则正确分配了 LMA。

我正面临这个问题,因为该部分是在程序集文件中定义的。

你以前遇到过这个问题吗?

编辑 - 解决方案:事实证明 .JumpSection 必须使用正确的属性定义: .section ".JumpSection","ax",%progbits

只有这样,链接器才能正确运行。