一直要学嵌入式,可都不知道该如何学,这是csdn上的学习的一点记录,还没有测试过。
<<嵌入式系统实践教程>> 机械工业出版社(附DVD光盘) 陈渝 主编
GCC 二进制工具包。包含gcc/binutil/libc等。GCC包括编译器和链接器
对于ARM 可以下载 arm-linux-tools-20061213.tar.gz
将其解压到某个目录中
#tar -xzvf arm-linux-tools-20061213.tar.gz -c ./
设定运行的环境变量:
export PATH=$(your_path):$PATH
GCC的主要二进制工具包含以下部分:
归档工具:ar
ELF格式文件信息读取:readelf
符号信息工具:nm
去除符号工具:strip
目标文件信息:objdump
目标文件复制:objcopy
#include <stdio.h>
int hello(int argc,char* argv[])
{
int i;
printf ("Hello world!/n");
for(i=0;i<argc;i++)
{
printf("argv[%d]=%s/n",i,argv[i]);
}
return 0;
}
对多个文件的编译和链接
#arm-linux-gcc main.c hello.c init.c -o test
分步编译
预处理,编译,汇编,
-s 、-E
#arm-linux-gcc -pipe -g -Wall -I. -c -o hello.o hello.c
链接
#arm-linux-gcc -Wall -g hello.o init.o main.o -o test
生成静态链接的可执行程序
#arm-linux-gcc -Wall -g hello.o init.o main.o -static -o test_static
ar归档工具生成静态库
#arm-linux-ar -rv libtest_s.a init.o hello.o
查看静态库中的内容
#arm-linux-ar -t libtest_s.a
删除静态库中的内容
#arm-linux-ar -d libtest_s.a init.o
直接链接静态库,不需目标文件
#arm-linux-gcc -Wall main.o -L. -ltest_s -o testbylib
动态库生成
#arm-linux-gcc -shared -Wall -g hello.o init.o -o libtest_d.so
链接动态为生成可执行程序
#arm-linux-gcc -Wall -g main.o -L. -ltest_d -o test_exe
修改环境变量
#export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
readelf读取ELF文件信息
#arm-linux-readelf -h hello.o
#arm-linux-readelf -h XXX
另一个linux下的工具file看ELF
#file hello.o libtest_d.so test
nm用于显示文件中的符号 用于各种ELF格式
T代码段
D已初始化的数据段
B未初始化的数据段
U使用但没有定义的符号
W,weak缩写,其他符号可以覆盖当前定义
小写代表局部local符号,大写代表全局global符号
strip去除符号工具
#arm-linux-strip test -o test_stripped
#arm-linux-nm test_stripped
#arm-linux-file test_stripped
objdump显示文件信息
-D 显示文件中所有汇编信息
-R 显示文件的动态重定位入口,仅对动态为有意义
#arm-linux-objdump -h hello.o
#arm-linux-objdump -D hello.o
objcopy 目标文件复制
可将上标文件转换成另一种格式的目标文件,还可以用于去除文件中的信息。
转换为纯二进制文件
#arm-linux-objcopy test -O binary test.bin
生成S-Redord格式文件
#arm-linux-objcopy test -O srec test.srec
更改输出文件的信息
#arm-linux-objcopy test -S test.stripped