踩坑
前段时间在分析问题的时候,以 ARM 为例,发现代码段在 .o
和最终的 elf
文件中的大小端是不同的。
构造了测试例如下:
int a = 0x66778899;
int b = 0xaabbccdd;
int main()
{
asm volatile (
".inst 0x11223344 \n"
".inst 0xe1e740d2 \n"
:::);
return 0;
}
目标文件
- armeb
- arm
可以看到在目标文件中,无论是代码还是数据都是按照指定大小端排列的,armeb 按大端排列,arm 按小端排列。
可执行文件
- armeb
可以看到,指令在 elf 中呈现小端的排列方式。
- arm
可以看到,指令在 elf 中呈现小端的排列方式。
结论
结论是对于目标文件而言,指令和数据都是按照构建时指定的大小端来排列的,而 elf
中最终指令总是小端呈现,而数据段则根据构建时指定的大小端存放。原因应该是 arm 取指时总是小端处理,因此 elf 中指令总是小端放置的。