GNU gcc ld:引用外部代码的特殊部分的常量CRC值

dojqjjoe  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(178)

我正在处理一个项目,其中包含需要在运行时使用CRC值从闪存验证的代码子集。使用链接器将此代码放入其自己的闪存部分,并在构建期间计算CRC值并将其注入内存的适当区域。然后在运行时读取闪存并进行CRC,并与存储的值进行比较。这一切都按预期正常工作。
放置在闪存的这个特殊部分的代码被认为是关键的,这就是为什么需要在运行时定期验证它是否正确的原因。CRC值还应该用于验证在不同版本之间没有对关键部分进行任何更改。这就是没有按预期工作的原因。
当对代码的非关键部分进行更改时(例如放置在flash的normal .text区域中的内容)在关键代码中有小的差异。在检查更改后,似乎大多数,也许是所有,的更改是由于外部函数/变量引用,这些引用不在闪存的关键代码段中。这当然是有意义的,因为链接器将插入对其他函数的调用,无论它们可能被放置在闪存中的什么地方,当然这是可以改变的。
是否可以强制链接器在flash的这一部分引用静态的外部函数/变量?我想这可以通过某种查找表来实现,其中包含虚拟内存/函数地址,然后是实际内存/函数地址,关键代码部分将只引用虚拟地址?

mum43rcc

mum43rcc1#

你没有说你使用的是什么CPU,但是假设你想从你的临界区调用例程do_stuff,用签名int do_stuff(int a, intb),那么你需要在你的临界区有一个头:

int tramp_do_stuff(int a, int b);

和一个程序集文件,其中每个函数都有一个trampoline:

.org 7ffff00H         ;; however you specify a fixed address in your asm
_tramp_do_stuff:         ;; this address is fixed
        JMP do_stuff     ;; This address gets set by linker
_tramp_next_trampoline:

相关问题