我对gcc编译器中的目标代码生成有疑问。
在我的程序中,objdump显示生成了CSWTCH
节。
你能解释一下C代码中需要生成
CSWTCH
节的标准吗?CSWTCH
部分的分配输出区域是否为.rodata
?在什么情况下会将小的rodata分配为
CSWTCH
的输出区域?
我对gcc编译器中的目标代码生成有疑问。
在我的程序中,objdump显示生成了CSWTCH
节。
你能解释一下C代码中需要生成CSWTCH
节的标准吗?
CSWTCH
部分的分配输出区域是否为.rodata
?
在什么情况下会将小的rodata分配为CSWTCH
的输出区域?
.section
和.type
指令。$ cat cswitch.c
int sw_2 (char x)
{
switch(x)
{
case '0': return -1;
case '1': return 2;
case '2': return 3;
case '3': return 5;
case '4': return 7;
case '5': return 11;
case '6': return 13;
case '7': return 17;
case '8': return 19;
case '9': return 23;
case 'a':return 29;
case 'A':return 29;
}
return -1;
}
$ gcc -Os -S cswitch.c
$ cat cswitch.s
.file "cswitch.c"
[mass snippage]
.section .rodata
.align 32
.type CSWTCH.1, @object
.size CSWTCH.1, 49
CSWTCH.1:
-Os
开关。使用-O
会得到一个更典型的跳转表。.section
指令最终将表应用并放置在.rodata
部分中。但这只是某个系统实现方法 - 编译器没有硬性要求。int sw_3(char x)
{
const char table['a' - '1'] = {
'1' - '1': 2,
'2' - '1': 3,
'3' - '1': 5,
/* ... fill in the remainder as needed */
};
if (x >= '1' && x <= 'A') return table[x - '1'];
return -1;
}
(这种转换假设系统使用ASCII或UTF-8或类似的编码方式。)然而,即使在这种情况下,只要编译器生成的结果符合适用的标准要求,它就可以生成任意的机器码。
.srodata
部分旨在作为“小型只读数据”:通常的想法是将所有小节收集在一起,并设置它们以使用短偏移寻址指令进行寻址,因此您应编写一个链接器脚本来执行此操作(或使用提供的执行此操作的脚本)。 - torek
switch
语句映射到查找表并最终存储在.data
中时,这些错误会被生成。 - Matteo Italia