佚名通过本文主要向大家介绍了字节对齐问题,readl的字节序问题,字节,字节换算,一个字节多少位等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: gnu ld 链接脚本引入的字节对齐问题,求解
描述:
. = ALIGN(4);
_device_enmu_start = .;
*(.data.enmu.dev)
_device_enmu_end = .;
源代码中定义了两个struct A (共20字节)的结构体全局变量,放在data.enmu.dev特定的数据段中。本意是想 _device_enmu_start 这个脚本变量,指向结构体的首地址。通过 _device_enmu_start 遍历出struct A 类型的所有数据。
而实际反汇编查看到,_device_enmu_start 和结构体首地址之间,增加了4字节0,作为填充!! 导致它不能指向结构体首地址,程序错误!
804bf614 <_device_enmu_start>:
804bf614: 00000000 nop <---- 这个就是添加的额外4字节
804bf618 <__device__AAAAAA>: <---- 这里才是结构体首地址
804bf618: 80458be8 lb a1,-29720(v0)
804bf61c: 80458bf8 lb a1,-29704(v0)
804bf620: 80458c08 lb a1,-29688(v0)
804bf624: 804980a8 lb a5,-32600(v0)
804bf628: 12345678
...
如何禁止掉链接器自动添加的字节,使得全局变量紧密排列?
解决方案1:
描述:
链接脚本 字节对齐
gnu ld 链接脚本片段:. = ALIGN(4);
_device_enmu_start = .;
*(.data.enmu.dev)
_device_enmu_end = .;
源代码中定义了两个struct A (共20字节)的结构体全局变量,放在data.enmu.dev特定的数据段中。本意是想 _device_enmu_start 这个脚本变量,指向结构体的首地址。通过 _device_enmu_start 遍历出struct A 类型的所有数据。
而实际反汇编查看到,_device_enmu_start 和结构体首地址之间,增加了4字节0,作为填充!! 导致它不能指向结构体首地址,程序错误!
804bf614 <_device_enmu_start>:
804bf614: 00000000 nop <---- 这个就是添加的额外4字节
804bf618 <__device__AAAAAA>: <---- 这里才是结构体首地址
804bf618: 80458be8 lb a1,-29720(v0)
804bf61c: 80458bf8 lb a1,-29704(v0)
804bf620: 80458c08 lb a1,-29688(v0)
804bf624: 804980a8 lb a5,-32600(v0)
804bf628: 12345678
...
如何禁止掉链接器自动添加的字节,使得全局变量紧密排列?
解决方案1:
那你不要设置字节对齐啊,他为了字节对其在前面添加的。 . = ALIGN(4); 删掉