2

我正在开发一个操作系统,我需要在设置分页之前加载一些模块。因此,由于此时没有设置分页,我需要将程序中的所有符号重新定位到物理地址。我的问题是,并非所有符号都可以在符号表中找到,并且并非所有重定位信息都可以在 rel.text 中找到。如何让 GCC 导出所有符号数据???

4

2 回答 2

2

当然,任何需要重定位的东西都在重定位表中。还能怎么加载?无论是否启用分页,重定位的工作方式完全相同 - 二进制中的绝对位置条目以偏移量列出,然后由加载软件处理。没有搬迁,其他一切都应该没问题。

请注意,符号表本身对于解析重定位没有意义,因为它只给出了符号的位置。

您是否正在考虑操作系统本身中的符号?如果是这样,这确实是以适当的方式从您的操作系统中导出符号的情况。Linux 有 EXPORT_SYMBOL(name),它在内核本身内构建一个符号表。[请注意,这不是由gccor生成的符号ld,而是由宏构建并在内核中处理的符号。

编辑以澄清,因为我在“评论”中的空间不足:有两种类型的“重定位”:内部的 - 您对自己模块中的事物有绝对引用,例如指向字符串的指针、指向函数的指针、跳转表对于 switch 语句,等等 - 这些应该只是将当前值与二进制实际所在位置的偏移量相加的问题(当然是虚拟地址)。另一个是“外部引用”,比如当你的模块调用时,比如说spinlock()- 这不是在模块内部实现的,所以它会有一个“外部参考”。在这种情况下,将有一个以“spinlock”作为名称的重定位条目以及对 spinlock 的调用在模块中的偏移量。现在您显然需要一个符号表来查找内核“自旋锁”的位置[如果您想变得非常复杂,请允许模块引用其他模块,但我会保留它,直到您有一个模块加载OK第一的!]。

于 2013-01-21T08:15:05.603 回答
0

真的,您的问题是关于链接器的。答案取决于您使用的链接器。

如果是ldgcc下的标准链接器,试试“-Wl,-r”选项。

于 2013-01-21T07:45:16.530 回答