问题标签 [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.
linux - 在 CentOS5 机器上运行 Ubuntu 12.04 编译的 C++ 程序
我有一堆使用 g++ 在 C++ 中在 Linux 上开发的软件。该代码可在 Ubuntu 12.04 和 CentOS 5 上编译和运行。我们有一些旧服务器仍在运行 CentOS 5。目前我为这两种操作系统进行编译。我想开始使用一些 C++11 特性。这些在 Ubuntu 12.04 上受支持,但在 CentOS 5 上不受支持。
我正在尝试在 Ubuntu 上为 CentOS 生成可执行文件。为此,我将所有可执行文件与
-Wl,-rpath,/home/arcamax/lib
这应该告诉它在标准位置之前在 /home/arcamax/lib 中查找共享库。然后我在 Ubuntu 机器上使用“ldd”来构建所需库的列表,并将这些库复制到 CentOS 机器上的 /home/arcamax/lib 中。当我尝试在 CentOS 机器上运行程序时,我得到:
当我在 CentOS5 机器上运行 ldd 时,我得到如下输出:
请注意,有一个库 /lib64/ld-linux-x86-64.so.2 仍在从系统位置提取。我不知道为什么会这样。当我尝试运行程序时,我得到:
重定位错误:/home/arcamax/lib/libgnutls.so.26:符号时间,版本 GLIBC_2.2.5 未在带有链接时间参考的文件 libc.so.6 中定义
一些程序失败 ldd 并显示以下消息:
不是动态可执行文件
当我尝试运行这些程序时,它们会报告与其他程序相同的错误。
32bit-64bit - PIC 编译 - 错误:创建共享对象时无法使用针对“vtable for hit”的重定位 R_X86_64_32S;使用 -fPIC 重新编译
我是 Linux 的新手,我在编译一个在 32 位机器上运行良好的 make 文件时遇到了麻烦。我没有编写这个程序,但我需要它来使用它的功能。我的机器是 64 位的,我收到以下消息错误:
我一直试图通过使用这个网站来解决这个问题,但我没有让程序工作...... http://www.gentoo.org/proj/en/base/amd64/howtos/index.xml? part=1&chap=3 我不习惯生成文件,这就是为什么我没有设法正确修改生成文件以 PIC 编译共享库。我在全局范围内添加了标志'export CXXFLAGS=$CXXFLAGS -fPIC',但它没有用。我完全迷路了。
这是制作文件(两个制作文件和一个调用它们的文件)。
-----------------------------------------2 -------- ------------
----------------------3--------------
希望有人能帮助我。提前致谢!!丹尼尔
c - 如何让 GCC 将所有符号导出到输出文件
我正在开发一个操作系统,我需要在设置分页之前加载一些模块。因此,由于此时没有设置分页,我需要将程序中的所有符号重新定位到物理地址。我的问题是,并非所有符号都可以在符号表中找到,并且并非所有重定位信息都可以在 rel.text 中找到。如何让 GCC 导出所有符号数据???
c++ - 如何在arm可执行文件中获取printf函数的地址
我有责任为 ARM elf 可重定位文件制作加载器。我设法以某种方式解析了精灵,并设法进行了一些简单的重定位,但是我必须执行以下操作并且遇到了麻烦。我需要从我试图加载的这个 ELF 文件中调用 printf 函数,它必须与试图加载它的程序中的 printf 函数相同。(那是我的主机程序,用 ARM arch 的 c++ 编写)。我怎样才能得到这个 printf 地址,然后我怎样才能在 elf 文件中重新定位符号。(我用谷歌搜索发现这种类型的重定位使用 24 位 PC 相对寻址)谁能帮我提取 printf 的地址?提前谢谢!
assembly - 搬迁的概念是什么意思?
我是组装新手,因此想更多地了解搬迁的概念。
- 为什么我们需要重新定位程序、数据?
- 它究竟是如何完成的?
如果有人可以用初学者级别的示例进行解释,那就太好了。
mips - 使用 GNU ld,如何强制指定特定(外部)符号的地址而不会出现“重定位截断”错误?
我有两个函数,a()
和b()
,它们都有特定的、固定的加载/运行时地址。我正在编译a()
自己,而b()
已经提供(例如在 ROM 中)。
该文件a.c
如下:
这将生成以下汇编代码:
所以它在那里放置了一个 26 位的重定位b()
(调用的目标是从调用指令本身的地址开始的 26 位偏移量)。假设 和 的具体地址a
分别b
为 0x80001000 和 0x80002000。那应该没问题;b
很容易触手可及a
。
所以在我的链接器脚本中,我有这样的东西:
但是,a.o
与此脚本链接会给我以下错误:
据推测,这是因为链接器试图将完整的 32 位值 ( 0x80002000
) 放入 26 位空间中以供跳转目标使用。我的链接器脚本有什么问题?
reverse-engineering - ELF 重定位逆向工程
我希望你们能帮助我了解重定位条目和 ELF 部分数据是如何相关的,以及它们是如何处理和生成的。
我有一个古老的不受支持的工具,它获取一个 ELF 文件和一个相关的 PLF 文件(部分链接的文件,在构建过程的早期生成),并从中构建一个自定义的可重定位文件,该文件在具有严格内存限制的平台 (PPC) 上使用。这很好用,只是它包含大约一兆的初始化代码,我们要在启动后卸载。因此,我们将所有初始化代码放在自定义部分中以便卸载它,但不幸的是,该工具无法正确处理自定义部分并且 rel 文件无效。所以我的任务是制作一个新工具,可以正确生成这个包含自定义部分的可重定位文件。
我在使用这个工具和生成 rel 文件方面已经取得了相对较远的进展,但目前我陷入了试图弄清楚如何处理部分数据和构建重定位条目等方面的困境。我是一个高级程序员,摆脱了我的这个任务的元素,所以所有这些逆向工程业务对我来说都是新的(感谢互联网!)。
我找到了Elf Sharp,并以此为起点。它允许我加载 ELF 和 PLF 文件并与它们的内容进行交互。从那里,我对重定位文件的标题和内容进行了逆向工程,但它远非准确。当我将旧工具的文件版本与我的文件进行比较时,我发现一些部分数据已被修复,而我的文件直接使用 PLF 文件中的部分数据并且是普通的。我的意思是我复制的部分数据包含大量“48 00 00 01”,但这些都是由旧工具以某种方式修复的。这些字节的意义是什么,对它们做了什么?我还必须生成重定位条目,但不确定如何继续。
我在网上找到了一些处理精灵重定位的例子,我的工具中有类似的东西正在运行,但我仍然不清楚我到底应该做什么。对于所有重定位类型及其公式(此处为第 4.12.5 章),我都有很好的资源,但我仍然不太确定应该使用哪些偏移量、部分信息等。
TL;博士
你能帮我想象一下这些重定位条目到底发生了什么,它是如何生成和处理的,以及它在程序执行时是如何使用的?
对section数据中所有的“48 00 00 01”字做了什么?我假设他们已经用适当的符号解决了,但是这是怎么做的呢?使用 .rela 信息?
另外,我不确定什么时候应该使用 PLF 内容,什么时候应该使用 ELF 内容。我想我只需要 ELF 来获取加载地址和段信息。
当我生成重定位修正(在 PPC 上)时,我如何准确地评估重定位类型方程?我在网上提到的例子在这一点上并不直观。我对偏移量感到困惑——你从 Elf32_Rela 得到一个,但那是你修改的那个吗?用于记录修复结果的偏移量是多少?加数究竟是什么?我还没有在网上找到任何有启发性的东西。
一些(实际上是大多数)重定位修复指向几个 .debug_ *节或 .bss 之一。我应该跳过 .debug 修复还是那些很重要?.bss 是 NoBits 部分,那么我该如何处理呢?当涉及到实际生成重定位条目时,我了解它们是如何构造的,但实际上是谁/是什么在制作这些条目?我的意思是,我已经准备好构建它,但我不知道从哪里开始——我是在某处迭代一些数据还是什么?
还有其他我应该问但尚未意识到的问题吗?;)
感谢您阅读我冗长的问题!
svn - SVN 重定位后 SVN 更新不起作用
我最近将我的 SVN 存储库从 SERVER1 迁移到 SERVER2。
- 在 SERVER2 上安装了 SVN。
- 使用
svnrdump
实用程序转储存储库。 - 使用
svndump load
实用程序将转储文件加载到新的 svn 服务器。
我从 SERVER1 svn的路径中检查了一个工作副本WC 。http://SERVER1/project1/data
这里注意一件事:
- 当我转储时,SERVER1 上的 SVN 版本是 12345。
- 当我签出WC时,SVN 版本是 13456。
现在,使用relocate from tortoise svn on windows
,我已将WC 重新定位到 SERVER2 svn 到 path http://SERVER2/project1/data
。
搬家成功。
在此之后,我正在尝试check-in
从 rev-12345 到 rev-13456 到 http://SERVER2/project1/data
.
但是,这就是正在发生的事情:
- 提交操作不显示任何要提交的文件。
- 检查修改不显示任何更改。
- SVN 更新显示错误“没有这样的修订:13456”。
- 我更改了一个存在于WC和
http://SERVER2/project1/data
的文件,并尝试提交它。这里还给出了“没有这样的修订:13456”。
我期待着当WCSERVER1 的 rev-13456 的 http://SERVER2/project1/data
将从 SERVER2 的 rev-12345 重新定位时,它将显示这两个修订版之间的所有差异。
注意:我在上面尝试,因为 SERVER1 将在一段时间后关闭。截至目前,两个存储库都存在。SERVER1 仍在被人们使用,SERVER2 将与 SERVER1 保持同步。
reverse-engineering - 处理 ELF 重定位 - 了解重定位、符号、节数据以及它们如何协同工作
TL;博士
我试图把这个问题变成一个简短的问题,但这是一个复杂的问题,所以它最终变得很长。如果您可以回答其中的任何部分或提供任何建议或提示或资源或任何东西,那将非常有帮助(即使您没有直接解决我的所有问题)。我现在正用头撞墙。:)
这是我遇到的具体问题。阅读下文了解更多信息。
- 我正在寻找有关如何处理重定位条目和更新节数据中未解析符号的指导。我只是不明白如何处理我从搬迁和部分等中提取的所有信息。
- 我也希望了解链接器遇到重定位时发生了什么。尝试正确实现重定位方程并以正确的方式使用所有正确的值是非常具有挑战性的。
- 当我遇到操作码和地址和符号等时,我需要了解如何处理它们。我觉得我错过了一些步骤。
- 我觉得我不太了解符号表条目如何与重定位交互。我应该如何使用符号的绑定、可见性、值和大小信息?
- 最后,当我用可执行文件使用的解析数据和新的重定位条目输出我的文件时,数据都是不正确的。我不确定如何跟踪所有搬迁并提供所有必要的信息。可执行文件对我有什么期望?
到目前为止我的方法
我正在尝试以严重基于 ELF 的特定 [未记录] 专有格式创建重定位文件。我编写了一个工具,它采用 ELF 文件和部分链接文件 (PLF) 并处理它们以输出完全解析的 rel 文件。此 rel 文件用于根据需要加载/卸载数据以节省内存。该平台是 32 位 PPC。一个问题是该工具是用 c# 为 Windows 编写的,但数据是为 PPC 准备的,因此需要注意一些有趣的字节序问题等。
我一直在尝试了解在用于解析未解析的符号等时如何处理重定位。到目前为止,我所做的是从 PLF 复制相关部分,然后对于每个相应的 .rela 部分,我解析条目并尝试修复部分数据并根据需要生成新的重定位条目。但这就是我的困难所在。我在这里已经脱离了我的元素,这种事情似乎通常由链接器和加载器完成,所以没有很多好的例子可以借鉴。但我发现了一些有帮助的,包括THIS ONE。
所以正在发生的事情是:
- 从 PLF 复制部分数据以用于 rel 文件。我只对 .init(无数据)、.text、.ctors、.dtors、.rodata、.data、.bss(无数据)和我们正在使用的另一个自定义部分感兴趣。
- 遍历 PLF 中的 .rela 部分并读入 Elf32_Rela 条目。
- 对于每个条目,我提取 r_offset、r_info 和 r_addend 字段,并从 r_info(符号和 reloc 类型)中提取相关信息。
- 从PLF 的符号表中,我可以得到symbolOffset、symbolSection 和symbolValue。
- 从 ELF 中,我得到了 symbolSection 的加载地址。
- 我计算 int localAddress = ( .relaSection.Offset + r_offset )。
- 我从 r_offset 处的 symbolSection 内容中获得了 uint relocValue。
- 现在我有了我需要的所有信息,所以我打开 reloc 类型并处理数据。These are the types I support:
R_PPC_NONE
R_PPC_ADDR32
R_PPC_ADDR24
R_PPC_ADDR16
R_PPC_ADDR16_LO
R_PPC_ADDR16_HI
R_PPC_ADDR16_HA
R_PPC_ADDR14
R_PPC_ADDR14_BRTAKEN
R_PPC_ADDR14_BRNTAKEN
R_PPC_REL24
R_PPC_REL14
R_PPC_REL14_BRTAKEN
R_PPC_REL14_BRNTAKEN - 怎么办??我需要更新部分数据并构建伴随的重定位条目。但我不明白需要做什么以及如何去做。
我这样做的全部原因是因为有一个旧的过时的不受支持的工具不支持使用自定义部分,这是该项目的关键要求(出于内存原因)。我们有一个自定义部分,其中包含我们要在启动后卸载的一堆初始化代码(总共大约一个兆)。现有工具只是忽略该部分中的所有数据。
因此,虽然制作我们自己的支持自定义部分的工具是理想的,但如果有任何好的想法可以通过另一种方式来实现这一目标,我会全力以赴!我们一直在考虑使用 .dtor 部分来存储我们的数据,因为它几乎是空的。但这很麻烦,如果它阻止了干净的关机,它可能无论如何都不起作用。
重定位加上示例代码
当我处理重定位时,我正在处理 ABI 文档中的方程式和信息(大约第 4.13 节,第 80 页)以及我挖掘的许多其他代码示例和博客文章。但这一切都如此令人困惑,并没有真正拼写出来,而且我发现的所有代码的作用都有些不同。
例如,
- R_PPC_ADDR16_LO --> half16: #lo(S + A)
- R_PPC_ADDR14_BRTAKEN --> low14*: (S + A) >> 2
- ETC
那么当我看到这种代码时,我该如何破译呢?
这是一个示例(来自此来源)
这是另一个例子中的一些(这里)
还有另一个例子(来自这里)
我真的很想了解这些人在这里所做的魔法以及为什么他们的代码看起来并不总是一样的。我认为一些代码假设数据已经被正确屏蔽(用于分支等),而一些代码则没有。但我一点也不明白。
遵循符号/数据/重定位等
当我在 hexeditor 中查看数据时,我看到一堆“48 00 00 01”。我发现这是一个操作码,需要使用重定位信息进行更新(这专门用于 'bl' 分支和链接),但我的工具不能在绝大多数和我所做的那些上运行更新中有错误的值(与过时工具制作的示例相比)。显然,我错过了该过程的某些部分。
除了节数据之外,还有一些额外的重定位条目需要添加到 rel 文件的末尾。这些包括内部和外部搬迁,但我还没有弄清楚这些。(两者有什么区别,什么时候使用其中一个?)
如果您在该文件的末尾附近查看function RuntimeDyldELF::processRelocationRef
,您会看到正在创建一些重定位条目。他们还制作存根函数。我怀疑这对我来说是缺失的环节,但它就像泥泞一样清晰,我什至没有关注它。
当我在每个重定位条目中输出符号时,它们每个都有一个绑定/可见性 [Global/Weak/Local] [Function/Object] 和一个值、一个大小和一个部分。我知道该部分是符号所在的位置,并且值是该部分中符号的偏移量(或者它是虚拟地址?)。大小就是符号的大小,但这重要吗?也许全局/弱/本地对于确定它是内部还是外部重定位很有用?
也许我正在谈论创建的这个重定位表实际上是我的 rel 文件的符号表?也许这个表将符号值从虚拟地址更新为节偏移量(因为这是可重定位文件中的值,而 PLF 中的符号表基本上在可执行文件中)?
一些资源:
- 关于搬迁的博客: http: //eli.thegreenplace.net/2011/08/25/load-time-relocation-of-shared-libraries/
- 最后提到操作码:http ://wiki.netbsd.org/examples/elf_executables_for_powerpc/
- 我相关的未回答问题:ELF Relocation reverse engineering
哇!这是一个问题。恭喜你做到了这一步。:) 提前感谢您能给我的任何帮助。
arm - elf 格式的 ARM 静态重定位
是否有一些好的文档逐步解释如何在 elf 可重定位文件中应用静态臂重定位?
我找到了这个http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044e/IHI0044E_aaelf.pdf但它仍然很混乱。我不确定我是否一遍又一遍地遇到分段错误...拜托,有人吗?