riscv将全局变量固定到指定的地址
最近在工作中遇到一个场景,需要将rom中的某些静态(static)全局变量的符号导出并且在flash上使用。
首先就是确保这些rom中的静态全局变量导出到rom.elf文件中。通过riscv的nm工具可以看到rom.elf文件中这些静态全局变量的类型是b或s。小b和小s类型想在flash中的文件中通过extern符号去声明时发现编译器找不到这些rom中的静态全局变量。
经过百度之后发现可以通过riscv的ld工具--defsym选项将rom中静态全局变量固定到rom中的地址上,然后flash中去extern就可以访问了。
例如:rom中定义的test.c文件中定义了如下静态全局变量
static int g_test_val; // 该变量在rom.elf文件中地址是0x22000;
flash中想要使用这个变量:
extern int g_test_val;
flash上编译的时候在riscv的ld工具链接时添加如下选项即可:
ld --defsym g_test_val=0x22000; //此处省略了其他链接选项
如果是使用gcc链接则需要如下选项:
gcc -Wl, --defsym g_test_val=0x22000; //此处省略了其他链接和编译选项
