LD可以访问某个地址的数据吗?

标签 c linker

我正在为使用 Kinetis 处理器的项目编写一些代码。这些处理器有一个闪存配置字段,存储在闪存中的特定地址。如果错误的值被写入该字段,您可以将自己永远锁定在芯片之外。

我的代码包括一个压缩结构、一个指定 .flashConfig 部分的实例、一些静态断言以确保该结构是所需的大小,以及写入 FSEC 字段的 #define(重要的一个)正如预期的那样。然后在链接描述文件中,我将该部分存储在闪存的正确位中。此外,我还有一个 ASSERT 来查看该部分中的数据量是否正确。

一切都很好,但我仍然很紧张(我已经多次看到这些筹码自己被锁住)。我想要做的是向链接描述文件添加一个额外的断言,例如:

ASSERT(BYTE_AT(0x40C) == 0xBE);

这可能吗?

我考虑过在后期构建步骤中使用 objdump/objcopy 从 .bin 中转储它。但是我是在 Windows 上构建它的,所以没有 grep/awk 这会很好也很容易。其他人也必须构建它,所以我不想依赖安装或不安装 cygwin。此外,它比链接器稍微移除了一点,因此如果有人移除了 post_build 脚本,很容易被遗漏。

最佳答案

I don't want to rely on cygwin being installed or what not.

编写一个 C 程序来执行与 objdumpgrep 相同的检查。

Plus this is a little more removed than the linker, and therefore could easily be missed if someone removes the post_build script.

让验证程序调用链接器,然后验证结果。也就是说,代替

${LD} -o foo.bin ${LDFLAGS} ${OBJS} && ./post_build foo.bin

这样做:

./build_and_verify -o foo.bin ${LDFLAGS} ${OBJS}

关于LD可以访问某个地址的数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41305086/

相关文章:

ios - 如何解决这个编译错误?

c - 链接器不通知多个定义

Linux串口的正确初始化顺序

malloc 可以在两个不同的进程中返回相同的地址吗?

c - 如何检查输入是否为C中的字母?

在 C 中捕获 SIGTERM

compiler-errors - 将选项传递给链接器时出现 "recompile with -fPIC"错误

c - 为什么我的C程序生成的机器代码与书中给出的不同?

c++ - Qt 项目链接面临 undefined reference

c++ - 有没有办法忽略未使用的 undefined reference ?