Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104681
  • 博文数量: 11
  • 博客积分: 2520
  • 博客等级: 少校
  • 技术积分: 172
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-17 09:26
文章分类
文章存档

2009年(11)

我的朋友

分类: LINUX

2009-05-14 09:57:05

为了学习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选项,这样你可以看到具体的编译连接过程

阅读(1678) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~