gcc attribute属性和section选项

转载: http://lihuize123123.blog.163.com/blog/static/878290522010420111428109/ 
利用 GCC 的 __attribute__ 属性的 section 选项来控制数据区的基地址。 以下例子,主要涉及到两个知识点,一个是 GNU C 扩展中的 attribute section 属性,关于这个知识点的相关信息可以参考: http://www.groad.net/bbs/read.php?tid=1035


测试代码

#include

int  localmemory0  __attribute__(( section( "LOCALmem")))  =  0;
int  localmemory1  __attribute__(( section( "LOCALmem")))  =  0;
int  globalmemory  __attribute__(( section( "GLOBALmem")))  =  0;

int  main ( int  argc ,  char  * argv [])
{
     localmemory0  =  0x456;
     localmemory1  =  0x123;

     globalmemory  =  localmemory0  +  localmemory1;
}

在上面的代码中,定义了两个非传统的 section : LOCALmem 和 GLOBALmem 。
程序里要求变量 localmemory0 和 localmemory1 存放在 section LOCALmem 中,而 globalmemory 存放在 section GLOBALmem 中。

下面编译程序
引用
beyes@linux-beyes:~/C/GNU_C_EXT> gcc -c -o elf_section.o elf_section.c

或者
引用
beyes@linux-beyes:~/C/GNU_C_EXT> gcc -c -o elf_section2.o -fdata-sections elf_section.c

-fdata-sections 选项的目的是让编译器为每一个单独申明的数据 section 实际分配一个 section,而不是占用 .bss ,在某些系统上需要显式的使用这一参数。

使用 objdump 命令查看生成的 elf_section.o 文件
引用
beyes@linux-beyes:~/C/GNU_C_EXT> objdump -S elf_section.o

elf_section.o:     file format elf32-i386


Disassembly of section .text:

00000000 :
   0:    8d 4c 24 04              lea    0x4(%esp),�x
   4:    83 e4 f0                 and    $0xfffffff0,%esp
   7:    ff 71 fc                 pushl  -0x4(�x)
   a:    55                       push   �p
   b:    89 e5                    mov    %esp,�p
   d:    51                       push   �x
   e:    83 ec 04                 sub    $0x4,%esp
  11:    c7 05 00 00 00 00 56     movl   $0x456,0x0
  18:    04 00 00 
   1b:    c7 05 00 00 00 00 23     movl   $0x123,0x0
  22:    01 00 00 
  25:    a1 00 00 00 00           mov    0x0,�x
  2a:    8b 15 00 00 00 00        mov    0x0,�x
  30:    01 d0                    add    �x,�x
  32:    a3 00 00 00 00        

猜你喜欢

转载自blog.csdn.net/shenhuxi_yu/article/details/78468992
今日推荐