首页 > 代码库 > 浅挖《程序员的自我修养》的小问题

浅挖《程序员的自我修养》的小问题

一、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非常相似,因此用处可能是:计算函数调用栈。



浅挖《程序员的自我修养》的小问题