如何让GCC将所有符号导出到输出文件

时间:2013-01-21 05:24:52

标签: c gcc elf relocation

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

真的是你的问题是关于链接器。答案取决于你正在使用的链接器。

如果它是gcc下的标准链接器ld,请尝试使用“-Wl,-r”选项。