Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1427877
  • 博文数量: 430
  • 博客积分: 9995
  • 博客等级: 中将
  • 技术积分: 4388
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-24 18:04
文章存档

2013年(1)

2008年(2)

2007年(14)

2006年(413)

分类:

2006-06-30 14:22:25

 
嵌入式C语言编程分析
   
  FriendlyARM
   
  通常我们运行gcc来编译一个c语言程序,但是你编译知道背后的事情吗? 在嵌入式系统开发中,由于存储空间的限制,通常想尽办法来减小程序的大小和运行效率,这里是一个怎样减小程序大小的例子,本文将教你如何使用GNU GCC工具链的一些工具。
   

   
 
 
 
   

   
  1. 使用gcc一步步编译连接c程序
   
 

源代码:
/***************** halo.c ***************************/
int main(void)
{
     write(1,"hello\n", 6);
     return 0;
}
/***************** end ******************************/

这样来编译:
(1)先把它变成汇编代码,使用gcc的-S选项
[root@localhost c]# gcc -S halo.c
(2)使用as汇编器进行汇编
[root@localhost c]# as -o halo.o halo.s
(3)使用连接器连接目标文件,并使用简洁的uClibc库
[root@localhost c]# ld -static -o halo halo.o /opt/uClibc/lib/crt0.o -L/opt/uClibc/lib -lc
(4)运行程序
[root@localhost c]# ./halo
hello


   
  2. 使用objdump和objcopy分析和处理
   
 

上面我们使用了uClibc库以减小整个程序的大小,其实在可执行二进制 文件中,有很多不必要的信息,我们可以使用objcopy把它们抽取掉, 程序仍然可以正常运行。

(1)检验抽取之前的大小:
#ls -l halo
-rwxr-xr-x 1 root root 2222 8 4 14:29 halo

(2)使用objdump进行进行信息检验

[root@localhost c]# objdump -h halo

halo: file format elf32-i386

Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000198 08048074 08048074 00000074 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .rodata 00000007 0804820c 0804820c 0000020c 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .data 00000010 08049214 08049214 00000214 2**2
CONTENTS, ALLOC, LOAD, DATA
3 .got 00000034 08049224 08049224 00000224 2**2
CONTENTS, ALLOC, LOAD, DATA
4 .bss 00000000 08049258 08049258 00000258 2**2
ALLOC
5 .comment 00000037 00000000 00000000 00000258 2**0
CONTENTS, READONLY
6 .note 00000014 00000000 00000000 0000028f 2**0
CONTENTS, READONLY
[root@localhost c]#

(3)使用objcopy把不用的信息去掉:

[root@localhost c]# objcopy -R .comment -R .note halo halo.min

(4)再看一看程序的大小吧:

[root@localhost c]# ll
total 24
-rwxr-xr-x 1 root root 2222 8 4 14:29 halo
[root@localhost c]#
-rw-r--r-- 1 root root 54 8 4 14:23 halo.c
-rwxr-xr-x 1 root root 2022 8 4 14:35 halo.min
-rw-r--r-- 1 root root 912 8 4 14:28 halo.o
-rw-r--r-- 1 root root 393 8 4 14:28 halo.s
-rw-r--r-- 1 root root 1431 8 4 14:34 readme

可见,我们生成的halo.min比以前的halo小了一些。
检验一下:
[root@localhost c]# ./halo.min
hello


   
  3. 使用objcopy进一步处理
   
 

同样先查看一下:
[root@localhost c]# objdump -h halo.min

halo.min: file format elf32-i386

Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000198 08048074 08048074 00000074 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .rodata 00000007 0804820c 0804820c 0000020c 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .data 00000010 08049214 08049214 00000214 2**2
CONTENTS, ALLOC, LOAD, DATA
3 .got 00000034 08049224 08049224 00000224 2**2
CONTENTS, ALLOC, LOAD, DATA
4 .bss 00000000 08049258 08049258 00000258 2**2
ALLOC
把comment段去掉,这些好像是注释信息吧:)
[root@localhost c]# objcopy -S -R .comment -R .note halo halo.min

看看大小先:
[root@localhost c]# ll
total 24
-rwxr-xr-x 1 root root 2222 8 4 14:29 halo
-rw-r--r-- 1 root root 54 8 4 14:23 halo.c
-rwxr-xr-x 1 root root 924 8 4 14:37 halo.min
-rw-r--r-- 1 root root 912 8 4 14:28 halo.o
-rw-r--r-- 1 root root 393 8 4 14:28 halo.s
-rw-r--r-- 1 root root 1972 8 4 14:36 readme

现在halo.min只有924个字节了,运行一下:
[root@localhost c]# ./halo.min
hello

 

 

如何为SBC-2410X配置和编译内核
   
  FriendlyARM SBC-2410X
   
  一般运行make menuconfig配置内核,内核的配置选项有很多,用户可以使用我们提供的预配置文件kernel_preconfig.friendlarm,也可以自行配置,选择相应的配置时,有三种选择(按空格键进行选择),它们分别代表的含义如下:
     [*] - 将该功能编译进内核
   [ ] - 不将该功能编译进内核
   [M] - 将该功能编译成可以在需要时动态插入到内核中的模块

   
  下面是SBC-2410X所用到的内核选项配置,仅供参考:
   
  内核配置主菜单,点其中任何一项可以进入该项介绍。
 

   
  Code maturity level options --- 代码成熟等级
  (蓝色部分是SBC-2410X选配,仅供参考)
 
  配置选项:
  [ * ]Prompt for development and/or incomplete code/drivers
[   ]Prompt for obsolete code/drivers
  说明:
  如果要试验现在仍处于实验阶段的功能,比如IPv6等,就必须把该项选择为Y了;否则可以把它选择为N。在Linux的世界里,每天都有许多人为它开发支持的driver和加强它的核心。但是有些driver还没进入稳定的阶段。但其作者很欢迎其他人去测试这些driver并提出一些bugs。这个问题是说,有一些drive还在做测试中,问您是否要选择这些driver或支持的程序码。
 

 
  Loadable module support --- 对模块的支持
  (蓝色部分是SBC-2410X选配,仅供参考)
 
  配置选项:
  [*] Enable loadable module support
[ ] Set version information on all module symbols
[*] Kernel module loader
 
 
 

 
  System Type --- 系统类型
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  General setup --- 普通的属性设置
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  Parallel port support --- 并口支持
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  Memory Technology Devices (MTD) --- MTD设备
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  Plug and Play configuration --- 即插即用配置
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  Block devices --- 块设备
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  Multi-device support (RAID and LVM) --- 多设备驱动支持
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  Networking options --- 网络选项
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  Network device support --- 网络设备支持
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  Amateur Radio support --- 业余无线广播
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  IrDA (infrared) support --- 红外支持
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  ATA/IDE/MFM/RLL support --- ATA/IDE设备支持
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  SCSI support --- SCSI 支持
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  IEEE 1394 (FireWire) support (EXPERIMENTAL) --- 1394支持
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  I2O device support --- I2O设备支持
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 
 
 
  ISDN subsystem --- ISDN子系统
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  Input core support --- 输入输出设备
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  Character devices --- 字符设备
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  Multimedia devices --- 多媒体设备
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  File systems --- 文件系统
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  Console drivers --- 控制台
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  Sound --- 声音
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  Multimedia Capabilities Port drivers --- 多媒体兼容设备
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  USB support --- USB设备
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  Bluetooth support --- 蓝牙支持
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  Kernel hacking --- 内核调试
  (蓝色部分是SBC-2410X选配,仅供参考)
 
 
 
 
 

 
  Load an Alternate Configuration File --- 保存当前配置
 

 
  Save Configuration to an Alternate File --- 载入预配
   

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