首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >精灵在ARM Cortex-M3上的迁移

精灵在ARM Cortex-M3上的迁移
EN

Stack Overflow用户
提问于 2017-04-12 20:25:42
回答 1查看 926关注 0票数 1

我在试图弄清楚搬迁是如何进行的,但我似乎无法理解它。本文件描述了在重新定位ELF文件时可能遇到的不同类型。

让我们以R_ARM_ALU_SB_G0_NC (#70)为例。

  • 类型:静态
  • 类: ARM,描述要迁移的地方的类型(我不明白)
  • 行动:(s+ A) \x{e76f}B(S)

我猜数学表达式就是我要找的运算。然而,我并不完全理解这如何适合我的功能。进行重新安置的方法如下:

代码语言:javascript
复制
int elfloader_arch_relocate(int input_fd, struct elfloader_output *output,
    unsigned int sectionoffset, char *sectionaddr, struct elf32_rela *rela, char *addr)

input_fd是ELF文件的文件描述符,在写入输出段时使用*outputsectionoffset是可以找到重定位的文件偏移量,*sectionaddr是区段开始地址(绝对运行时),*addr是重新定位的地址。32位重定位结构如下所示

代码语言:javascript
复制
 struct elf32_rela {
   elf32_addr   r_offset;
   elf32_word   r_info;
   elf32_sword  r_addend;
 };

在上面提到的文档的第26页中,解释了这个术语:

  • S(单独使用时)是符号的地址。
  • A是搬迁的加载项。
  • 如果目标符号S具有STT_FUNC类型,且符号地址为拇指指令,则t为1;否则为0。
  • B(S)是定义符号的输出段的寻址来源。

因此,我的问题是,重新定位函数中的哪些参数对应于公式中使用的参数?

EN

回答 1

Stack Overflow用户

发布于 2017-04-12 20:42:33

如果我看得对,但我不确定我读错了,它是这样的:

  • Saddr
  • B(S)sectionaddr
  • Arela->r_addend
  • T可能是从rela->r_info中的信息派生出来的;如果不是,我不知道您需要在哪里查找。

这是一次非常复杂的搬迁。考虑从简单的(比如R_ARM_ABS16)开始。在动态加载器中,您不应该必须实现您链接到的规范中的所有重新定位类型,只需实现一个小子集。如果您似乎需要大量的重新定位类型,这可能是因为您试图将未链接的对象文件提供给动态加载器;您应该使用现有的ARM链接器将它们转换为共享对象。(对于GNU工具链,您如何做到这一点的第一个近似是gcc -shared foo.o -o foo.so。)

为架构提供现有的动态加载程序通常是一个很好的计划;这类事情的代码中往往隐藏着许多未记录的智慧。例如,这里是GNU‘s ld.so的手臂定位器。(LGPL)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43379029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档