加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

.rodata段分析

(2011-12-27 15:04:52)
标签:

linux汇编

it

分类: ASM汇编


1 .rodata段存放的内容
.rodata段存放的是常量。用C代码写一段程序,其中有些东西是被编译器放到.rodata段的。
例如:

char* fmt = "12345678";
int main()
{
      uart_send_string(fmt);
}

则字符串常量"12345678"是放在.rodata段的。

2 Object文件中.rodata段的分析
通过objdump可以查看object或elf文件的段的分布
$ arm-linux-objdump -h main.o

obj/main.o:     file format elf32-littlearm

Sections:
Idx Name            Size        VMA        LMA        File off    Algn
  0 .text           000000a8   00000000   00000000   00000034   2**2
                    CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  1 .data           00000004   00000000   00000000   000000dc   2**2
                    CONTENTS, ALLOC, LOAD, RELOC, DATA
  2 .bss            00000000   00000000   00000000   000000e0   2**0
                    ALLOC
  3 .debug_abbrev  0000009e   00000000   00000000   000000e0   2**0
                    CONTENTS, READONLY, DEBUGGING
  4 .debug_info    0000013d   00000000   00000000   0000017e   2**0
                    CONTENTS, RELOC, READONLY, DEBUGGING
  5 .debug_line    00000041   00000000   00000000   000002bb   2**0
                    CONTENTS, RELOC, READONLY, DEBUGGING
  6 .rodata         0000000c   00000000   00000000   000002fc   2**2
                    CONTENTS, ALLOC, LOAD, READONLY, DATA
  7 .debug_frame   00000050   00000000   00000000   00000308  2**2
                    CONTENTS, RELOC, READONLY, DEBUGGING
  8 .debug_pubnames  00000041   00000000   00000000   00000358   2**0
                    CONTENTS, RELOC, READONLY, DEBUGGING
  9 .debug_aranges  00000020   00000000   00000000   00000399   2**0
                    CONTENTS, RELOC, READONLY, DEBUGGING
 10 .comment       00000012   00000000   00000000   000003b9   2**0
                    CONTENTS, READONLY

这是一个没有被link的object文件,所以VMA/LMA的地址都是0x00。第一个字段表示段的大小。
.rodata的Size = 0x0000000C,即12个字节。"12345678"为什么需要12字节呢?因为字符串的末尾
还有一个NULL,所以共需9个字节。编译器把它对齐了一下,所以就用了12个字节。

最后一个字段表示该section在File中的偏移量,这里.text是从第34字节开始的,.rodata从第2fc字节
开始。用ultraedit打开之后可以发现在0x2fc的位置正是"12345678"

3 ELF文件中的.rodata段
$ arm-linux-objdump -h main.elf

simple.axf:     file format elf32-littlearm
Sections:
Idx Name            Size       VMA        LMA        File off    Algn
  0 .text           000001fc     30000000   30000000   00008000   2**2
                    CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .glue_7         00000000   300001fc   300001fc   000081fc   2**2
                    CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .glue_7t       00000000   300001fc   300001fc   000081fc   2**2
                    CONTENTS, ALLOC, LOAD, READONLY, CODE
  3 .data           0000004c   300001fc   300001fc   000081fc   2**2
                    CONTENTS, ALLOC, LOAD, DATA
  4 .bss            00000084   30000248   30000248   00008248   2**2
                    ALLOC
  5 .rodata        0000000c   300002cc   300002cc   000082cc   2**2
                    CONTENTS, ALLOC, LOAD, READONLY, DATA
  6 .debug_abbrev  000000da   00000000   00000000   000082d8   2**0
                    CONTENTS, READONLY, DEBUGGING
  7 .debug_info    00000345   00000000   00000000   000083b2   2**0
                    CONTENTS, READONLY, DEBUGGING
  8 .debug_line    0000021d   00000000   00000000   000086f7   2**0
                    CONTENTS, READONLY, DEBUGGING
  9 .debug_frame   00000050   00000000   00000000   00008914   2**2
                    CONTENTS, READONLY, DEBUGGING
 10 .debug_pubnames  00000041   00000000   00000000  00008964   2**0
                    CONTENTS, READONLY, DEBUGGING
 11 .debug_aranges  00000080   00000000   00000000   000089a8   2**3
                    CONTENTS, READONLY, DEBUGGING
 12 .comment       00000012   00000000   00000000   00008a28   2**0
                    CONTENTS, READONLY

这里的VMA和LMA都有了值,起始值0x30000000正是在链接脚本里指定的值。.text的File Offset是0x8000,
说明是从32k的位置开始的。

 

 

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有