TL; DR
我试图将这个问题作为一个简短的问题,但这是一个复杂的问题所以它最终会变长.如果您可以回答这方面的任何部分或提供任何建议或提示或资源或任何内容,那将非常有帮助(即使您没有直接解决我的所有问题).我现在正撞在墙上.:)
以下是我遇到的具体问题.请阅读下面的更多信息.
到目前为止我的方法
我正在尝试以特定的[未记录的]专有格式创建一个重定位文件,该格式主要基于ELF.我编写了一个工具,它接受一个ELF文件和一个部分链接文件(PLF)并处理它们以输出完全解析的rel文件.此rel文件用于根据需要加载/卸载数据以节省内存.该平台是一个32位PPC.一个问题是该工具是用c#编写的,但数据是针对PPC的,因此需要注意有趣的endian问题等.
我一直试图了解在用于解析未解析的符号等时如何处理重定位.到目前为止我所做的是从PLF复制相关部分,然后对于每个相应的.rela部分,我解析条目并尝试修复部分数据并根据需要生成新的重定位条目.但这就是我的困难所在.我离开了我的元素,这种事情似乎通常是由链接器和加载器完成的,所以没有很多好的例子可以借鉴.但是我发现了一些有帮助的东西,包括这一个.
所以发生的事情是:
我这样做的全部原因是因为有一个旧的过时不支持的工具不支持使用自定义部分,这是该项目的关键要求(出于内存原因).我们有一个自定义部分,其中包含一堆我们想要在启动后卸载的初始化代码(总计大约一兆).现有工具只是忽略该部分中的所有数据.
因此,虽然制作支持自定义部分的自己的工具是理想的,但如果有任何明智的想法以实现这一目标的另一种方式,我全都耳朵!我们已经提出了将.dtor部分用于我们的数据的想法,因为它几乎是空的.但这很麻烦,如果它阻止干净关闭,可能无论如何都无法工作.
重定位加示例代码
当我处理搬迁,我工作过的公式和信息在ABI文档中发现的HERE(约4.13节,第80ish),以及一些我已经挖出了其他代码示例和博客文章.但是这一切都让人感到困惑,并没有真正拼写出来,而且我发现的所有代码都有所不同.
例如,
所以,当我看到这种代码时,我该如何解读呢?
这是一个例子(来自这个来源)
case ELF::R_PPC64_ADDR14 : {
assert(((Value + Addend) & 3) == 0); …Run Code Online (Sandbox Code Playgroud) 我正在使用一个同时使用c ++和c#的项目.我一直致力于一个非常混乱的集成,并且一直在大量使用#pragma消息来调用尚未完全正常运行的代码(由于集成而中断).这是一个非常好的方法来混乱构建日志,因此很容易找到需要修复的东西.问题是我找不到任何与c#相同的方法.
我不想使用过时的属性,这根本不是我想要的.我尝试了#warn,但这只是生成一个"警告错误",导致构建失败.再一次,不是我正在寻找的(如果我想让构建失败,我可以使用#error ......).
现在我只是将我的消息放在可以搜索的注释中,但这需要了解要查找的内容以及寻找它的动机.在构建日志中使用自定义消息调用问题是更可取的,因为它很难被忽略!
我的研究让我相信没有办法做我想做的事,但我想看看你的专家是否同意我.:)