一、size中统计的text的大小与objdump中统计的一些大小不一致问题:
size(size.text ) == size( objdump.text + objdump.rodata + objdump.eh_frame)
二、.rodata段大小的计算方法
.rodata段存放的是常量。用C代码写一段程序,其中有些东西是被编译器放到.rodata段的。
例如:
char* fmt = "12345678";
int main()
{
uart_send_string(fmt);
}
则字符串常量"12345678"是放在.rodata段的。
通过objdump可以查看object或elf文件的段的分布
$ arm-linux-objdump -h main.o
这是一个没有被link的object文件,所以VMA/LMA的地址都是0x00。第一个字段表示段的大小。
.rodata的Size = 0x0000000C,即12个字节。"12345678"为什么需要12字节呢?因为字符串的末尾
还有一个NULL,所以共需9个字节。编译器把它对齐了一下,所以就用了12个字节
三、eh_frame段(根绝文章和网友回答推测的)
eh是exception handing的缩写
gcc处理异常时会生成eh_frame,可以推测eh_frame完全是依赖编译器的实现。
eh_frame是dwarf调试信息的辩题。
eh_frame的结构和debug_frame非常相似,因此用处可能是:计算函数调用栈。
时间: 2024-10-11 06:18:04