转载:
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