问题标签 [relocation]
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.
gcc - GCC inline asm:如何在共享库中使用变量地址作为立即操作数?
以下代码编译成可执行文件没有问题:
但作为一个共享库,我得到一个错误:
编译结果:
编译-fPIC
没有区别。我怎样才能调整它以使链接器重新定位对地址的引用foo
?它必须是 asm 中的立即整数操作数。
更新:我最终使用了一条不同的指令,它需要一个内存操作数,因为显然没有办法用立即操作数来做到这一点。
linker - 过程链接表和调用相关
我很好奇程序是怎样的readelf
,objdump
并且知道在指令gdb
旁边显示什么。callq
既然程序还没有运行,他们怎么知道要“通过”多远.plt
?他们是否根据传递给它的参数进行猜测?或者他们是否真的对程序进行了模拟运行以找出答案?
例如:
上面的代码知道去printf()
0x400890.plt
处:
这只是输出,objdump -d
所以我不确定程序是如何知道它想要的printf
。我能看到的唯一相关性是重定位索引 ( pushq $0x7
) 和 section .dynsym
,尽管它是一个值,因为它从 0 开始:
让我感到困惑的另一件事是.plt
条目中对 GOT 的引用 (#602050)。从中我看到readelf
它是.got.plt
基于地址范围的一部分,但是这些程序是如何在程序运行之前确定该值的呢?
** 编辑 **
c - 我对符号表和重定位表的使用理解是否正确?
我目前很难理解链接/加载概念。
您能否告诉我以下关于使用符号表和重定位表的陈述是否正确?
- 在可重定位目标文件中,符号表必须包含从其他目标文件访问/调用的变量和函数的条目。未在目标文件之外使用的变量和函数的列表是可选的。
- 这意味着如果程序仅包含一个目标文件,则可以省略符号表。
- 在可重定位目标文件中,重定位表保存了在加载期间必须更新的汇编代码的所有位置的地址。
- 在不可重定位的目标文件中,可以省略重定位表。但是,必须将对象加载到硬编码到指令中的地址空间中。
谢谢你的时间!
c - 如何读取目标文件的重定位记录
我试图了解 C 工具链的链接阶段。我编写了一个示例程序并剖析了生成的目标文件。虽然这有助于我更好地理解所涉及的过程,但有些事情我仍然不清楚。
以下是:
第 1 部分:初始化变量的处理。
这些重定位表条目是否正确...
...基本上是在告诉链接器,存储在 offset2b
和from的地址不是绝对地址,而是相对于? 据我了解,这使链接器能够35
3f
.text
.data
- 将这些相对地址转换为绝对地址以创建不可重定位的目标文件,
- 或者只是在目标文件与其他目标文件链接的情况下相应地调整它们。
第 2 部分:处理未初始化的变量。
我不明白为什么未初始化的变量与初始化变量的处理方式如此不同。为什么寄存器地址存储在操作码中,
- 对所有未初始化的变量(0x0、0x0 和 0x0)都相等,同时
- 所有初始化变量(0x0、0x4 和 0x8)都不同吗?
我也完全不清楚他们的重定位表条目的值字段。我本来希望.bss
那里会引用该部分。
elf - .elf 文件中的重定位节头信息
我为我糟糕的英语道歉,真的很难理解重定位部分的sh_info字段包含什么,以下是我从 ELF 文档中得到的信息:
它说
sh_info :包含应用重定位的节的节头索引
sh_link:包含相关符号表的节头索引。
很明显:sh_info 与重定位段相关的符号表段无关,其信息存储在 sh_link 中。
根据我的理解:重定位符号时,三个部分相关:重定位部分、符号表部分和包含符号表中符号定义的部分。
假设 1:所以我假设 sh_info 是关于前面提到的第三部分
-----但是,当我通过示例代码进行重定位时,我的假设似乎不匹配
-----Sicce r_info是重定位部分中仅包含的字段
这意味着 sh_info 是重定位节本身的索引。<假设 2
更让我困惑的是别人发的一个例子,阅读elf文件的例子
似乎 sh_info 字段信息与我之前的两个假设无关
谁能帮忙解释一下 sh_info 真正包含什么?
gcc - 复制搬迁的目的是什么?
背景:如果一个可执行文件有一个在共享对象中定义的外部数据引用,编译器将使用复制重定位并在其.bss 部分中放置一个副本。复制搬迁在本站有详细说明:http: //www.shrubbery.net/solaris9ab/SUNWdev/LLM/p22.html#CHAPTER4-84604
但是,我的问题是:
是否可以通过 GOT 来实现,就像共享对象中的外部数据引用一样?可执行文件可以通过它的 GOT 入口间接访问这个外部代码,并且这个 GOT 入口可以在运行时填充这个符号的真实地址。我不知道为什么 GCC 不这样实现它。副本重定位的好处是什么?
gdb - GDB 是如何知道可执行文件被重定位的?
我知道现代操作系统(如 Linux)并不总是在最初链接的同一地址执行应用程序。但是,当调试器开始环顾四周时,它需要知道原始链接地址和最终执行地址之间的关系。GDB如何计算偏移量?
澄清:我不是在谈论虚拟内存。也就是说,我(我相信是)对虚拟内存的工作原理有一个合理的理解,并且完全在该地址空间中运行。当我从 ELF 转储符号表时,我的符号位于一个位置,但当我从内存中获取它们的地址时,它们位于另一个位置。
在这种特殊情况下,我有一个字符串,它在链接的可执行文件中位于地址 0x0E984141。在该进程的内存转储中,它位于地址 0x0E3F2781。.rodata 部分中的所有内容至少已移动了 0x5919C0。它似乎类似于地址空间布局随机化。
arm - 在 AT91RM9200 上将 U-Boot 从内部 ROM 重新定位到 SRAM
我试图了解 u-boot 从内部 ROM 到 SRAM 的重定位。下面的代码显示 u-boot 从 ROM 复制到 SRAM,然后 pc 跳转到 _start_armboot。但是我无法弄清楚内存重映射操作在代码中发生的位置。
摘自 u-boot-2010.09\arch\arm\cpu\arm920t\start.S
AT91RM9200 数据表描述了内部 ROM 在复位后可以在地址 0x0000_0000 访问,而 SRAM 只能在地址 0x0020_0000 访问。重新映射后,SRAM 也可在地址 0x0000_0000 处使用,而内部 ROM 可在地址 0x0010_0000 处访问。
谁能帮我理解u-boot中的重映射操作并给我看对应的代码?
谢谢
javascript - 使用带有 TypeScript 的 JavaScript 进行重定位
我想使用 javascript 和 typescript 进行简单的重新定位。使用以下代码
做它应该做的,我仍然收到一个 TypeScript 错误,上面写着
使用 TypeScript 正确重定位的假定方法是什么?
c - GCC链接器:在指定部分移动符号
是否可以将代码中的某些函数移动到可执行文件的特定部分中?如果是这样,怎么做?
对于使用 gcc 编译的应用程序,我们有更多的源文件,包括 Xc 每个对象都是从关联的源代码编译的(Xo 是从 Xc 获得的),并且链接器会生成一个大的可执行文件。
我需要 Xc 中的两个函数位于可执行文件的特定部分,比如 .magic_section。我想要这个的原因是该部分将被加载到另一个内存区域而不是其余部分。
我的问题是我不能更改源 Xc,否则我会使用特定的标志,例如__attribute__ ((section ("magic_section")))
函数。
我在链接器的文档中阅读了一些内容,并为链接器编写了一个自定义脚本,但我没有指定必须将特定符号放置在哪个部分。我只设法移动了整个部分。