链接器脚本:将函数的绝对地址插入生成的代码中

我有一个与
gcc链接器有关的问题.

我正在使用嵌入式内容(PIC32),但PIC32的编译器和链接器基于gcc,因此,对于“常规”gcc链接器和PIC32链接器,主要内容应该是常见的.

为了节省闪存空间(这在微控制器上通常是不够的)我需要在引导加载程序中放置几个​​大函数,应用程序应该只通过指针调用这些函数.

所以,我需要在生成的代码中创建向量表.

我正在尝试获取函数的绝对地址并将其写入生成的代码,但仍然会出错.

在下面的例子中,我试图获取函数_formatted_write的地址.

码:

.user_addr_table _USER_ADDR_TABLE_ADDR :
{
   KEEP(*(.user_addr_table))
   LONG((ABSOLUTE(_formatted_write))); /* _formatted_write is a name of my function */
} > user_addr_table

链接器返回错误:“表达式中引用的”无法解析的符号’_formatted_write’.

我注意到如果我写了一些垃圾而不是_formatted_write,那么它会返回错误“undefined symbol …..”,所以,链接器知道_formatted_write.

它让我觉得我应该执行一些额外的步骤,使其“可解决”.但仍然不知道该怎么做.

最佳答案 我在这周围找到的方法是使用函数指针,即

void (*formatted_write)( int a, char * b, struct mystruct c );

然后,在启动时的代码中设置此函数的地址,即

formatted_write = 0xa0000;

然后,您可以使用常规约定调用您的函数.

此外,您可以在编译时使用-Wl, – just-symbols = symbols.txt标志.您可以按如下方式设置符号的地址:

formatted_write = 0xa0000;
点赞