链接器脚本是否可以访问makefile/shell变量并根据所述变量做出决定?
例如,假设我想在不使用不同的链接描述文件的情况下更改下面RAM区域的开头,是否可以使用make变量来执行此操作?
MEMORY
{
ifeq ($(SOME_VAR),0)
RAM (wx) : ORIGIN = 0x100000, LENGTH = 128K
else
RAM (wx) : ORIGIN = 0x200000, LENGTH = 128K
endif
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个具有严格启动时间要求的项目.目标体系结构是基于IA-32的处理器,以32位保护模式运行.确定可以改进的一个领域是当前系统动态初始化处理器的IDT(中断描述符表).由于我们没有任何即插即用设备且系统相对静态,我希望能够使用静态构建的IDT.
然而,由于8字节中断门描述符分割ISR地址,这证明对于IA-32拱是麻烦的.ISR的低16位出现在描述符的前2个字节中,其他一些位填充接下来的4个字节,最后ISR的最后16位出现在最后2个字节中.
我想使用const数组来定义IDT,然后简单地将IDT寄存器指向它,如下所示:
typedef struct s_myIdt {
unsigned short isrLobits;
unsigned short segSelector;
unsigned short otherBits;
unsigned short isrHibits;
} myIdtStruct;
myIdtStruct myIdt[256] = {
{ (unsigned short)myIsr0, 1, 2, (unsigned short)(myIsr0 >> 16)},
{ (unsigned short)myIsr1, 1, 2, (unsigned short)(myIsr1 >> 16)},
Run Code Online (Sandbox Code Playgroud)
等等
显然这不起作用,因为在C中执行此操作是非法的,因为myIsr不是常量.它的值由链接器解决(只能进行有限的数学运算)而不是编译器.
关于如何做到这一点的任何建议或其他想法?
谢谢,
我是一名使用IA-32型处理器的嵌入式软件工程师.我们正在寻找一个编译工具链 - 更好的免费.
我们曾经使用Mentor Graphics CodeBench Lite,但它已不再可用.
我们已经查看了其他GCC发行版,但它们都没有glibc的裸机实现.除了newlib之外没有,但由于GPL和LGPL许可问题,我们无法使用它.我们是OEM,我们的客户(和我们)拥有专有代码.
欢迎任何建议.