为了学习ELF文件格式,先写了一段汇编程序,和C写的代码,用他们生成的.o和最后的ELF文件格式来阐述映像文件的物理结构。
1 @test for learning.filename:hello.s 2 .section .data 3 .global relocaltion 4 .global num 5 num: 6 .long 10 7 .section .bss 8 data: 9 .space 1024 10 .section .text 11 .global sqr 12 .type sqr,%function 13 sqr: 14 mul r1,r0,r0 15 mov r0,r1 16 mov pc,lr 17
|
这是一个简单的计算平方的程序,里面与relocation相关的代码和计算平方毫无关系,子所以加入它,就是为了演示重定位数据而已。下面是C语言写的一个简单的C程序main.c,调用hello.s中的计算平方的程序,并打印出计算结果。代码如下:
1 /* 2 *filename:main.c 3 *for test elf 4 * */ 5 #include <stdio.h> 6 extern int num; 7 extern int sqr(int i); 8 int relocation = 0; 9 int main(void) 10 { 11 printf("square of %d is %d\n", num, sqr(num)); 12 return 0; 13 }
|
执行如下命令
$arm-linux-gcc -v -c hello.s
$arm-linux-gcc -v -g -c main.c
$arm-linux-gcc -v -g -o main main.o hello.o
这所以全部使用gcc是由于连接过程写的很复杂,连接了哪些库,它们在什么地方,这里使用了-v选项,这样你可以看到具体的编译连接过程
阅读(1691) | 评论(0) | 转发(0) |