一、gnu二进制工具集
1.1 gcc命令
将.s文件生成.o文件
arm-linux-gnueabihf-gcc -c asm-led -o asm-led.o
1.2 ldd链接器
ld:链接命令,将.o文件链接生成.elf文件,需要指定链接的入口地址
arm-linux-gnueabihf-ld -Ttext=0xc0008000 asm-led.o asm-led.elf
1.3 objdump生成反汇编
objdump:生成反汇编命令,将.elf文件生成反汇编文件
arm-linux-gnueabihf-objdump -D asm-led.elf > asm-led.elf
1.4 objcopy生成二进制文件
objcopy:生成二进制文件,将.elf文件生成存粹二进制文件
.elf文件:包含符号表信息,调试信息
.bin文件:不包含符号表信息,调试信息
arm-linux-gnueabihf-objcoypy -o binary asm-led.elf asm-led.bin
1.5 nm查看符号表信息
命令:arm-linux-gnueabihf-nm asm-led.elf
c00181e8 T __bss_end__
c00181e8 T _bss_end__
c00181e8 T __bss_start
c00181e8 T __bss_start__
c00081a8 t delay_1s
c00181e8 T _edata
c00181e8 T __end__
c00181e8 T _end
c0008000 t led1_init
c000816c t led1_off
c0008130 t led1_on
c0008054 t led2_init
c0008180 t led2_off
c0008144 t led2_on
c00080a8 t led3_init
c0008194 t led3_off
c0008158 t led3_on
c00080fc t loop
c00081ac t mm
c0008000 T _start
1.6 size查看各个段大小
arm-linux-gnueabihf-size asm-led.elf
1.7 readelf查看文件头部信息
arm-linux-gnueabihf-readelf -h asm-led.elf
1.8 strip压缩文件体积
strip压缩文件体积,不可以对中间文件进行压缩(.i,.s,.o)只可以对可执行二进制文件压缩
arm-linux-gnueabihf-strip asm-led.elf
1.9 addr2line调试段错误信息
addr2line:用来调试内核中段错误信息
格式:arm-linux-gnueabihf-addr2line 地址 -e 指定elf文件 -f
-e:指定elf可执行文件
-f:回显函数名,行号
linux@ubuntu:~/DC22081/01-asm-led$ arm-linux-gnueabihf-addr2line c000816c -e asm- led.elf -f
led1_off
/home/linux/DC22081/01-asm-led/asm-led.S:146
以上学习所有命令,支持x86架构和arm架构,如果想生成x86架构,直接使用命令即可,不需要加交叉编译工具链前缀
如果想生成arm架构,需要加交叉编译链前缀
二、gcc编译流程
2.1 预处理
预处理作用:头文件展开,去掉注释,宏替换,不检查语法错误
gcc -E *.c -o *.i
2.2 编译
编译:生成汇编文件,检查语法错误
gcc -S *.i -o *.s
2.3 汇编
汇编:生成二进制文件,检查语法错误
gcc -c *.s -o *.o
2.4 链接
链接:链接对应的库,生成.elf可执行文件
gcc *.o -o 可执行文件
三、分析Makefile文件
makefile中四种赋值方式有什么区别?
?= += := =
?= : 作用是当某变量前面已经定义赋值过,则不执行本次定义赋值,否则执行本次赋值
+= : 追加赋值,旧值保持不变,将新值黏贴到旧值后面
:= : 是覆盖式赋值,假如某变量在前面已经定义赋值过,则将本次赋值作为最新的变量值
= : 是最基本的赋值方式,与在文中位置无关,系统自动推导将最终的赋值作为该变量的值
CROSS_COMPILE = arm-linux-gnueabihf-
NAME = interface
CFLAGS += -g -marm -Wall -O0 -mabi = apcs-gnu -mfpu = neon -mfloat-abi= softfp -fno-builtin \
-nostdinc -I./common/include -I./include
LD = $( CROSS_COMPILE) ld
CC = $( CROSS_COMPILE) gcc
NM = $( CROSS_COMPILE) nm
OBJCOPY = $( CROSS_COMPILE) objcopy
OBJDUMP = $( CROSS_COMPILE) objdump
OBJSss := $( wildcard start/*.S) $( wildcard common/src/*.S) $( wildcard *.S) \
$( wildcard start/*.c) $( wildcard common/src/*.c) \
$( wildcard src/*.c) $( wildcard *.c)
OBJSs := $( patsubst %.S,%.o,$( OBJSss) )
OBJS := $( patsubst %.c,%.o,$( OBJSs) )
%.o: %.S
@echo " AS $@ "
@$( CC) $( CFLAGS) -c -o $@ $<
%.o: %.c
@echo " CC $@ "
@$( CC) $( CFLAGS) -c -o $@ $<
all:clean $( OBJS)
@echo " LD Linking $( NAME) .elf"
@$( LD) $( OBJS) -T map.lds -o $( NAME) .elf
@echo " OBJCOPY Objcopying $( NAME) .bin"
@$( OBJCOPY) -O binary $( NAME) .elf $( NAME) .bin
@echo " MAP Generating $( NAME) .map"
@$( NM) $( NAME) .elf > $( NAME) .map
@echo " OBJDUMP Objdumping $( NAME) .dis"
@$( OBJDUMP) -DS $( NAME) .elf > $( NAME) .dis
distclean clean:
@rm -rf $( OBJS) *.elf *.bin *.dis *.map
@echo " CLEAN complete."
install:
sudo cp $( NAME) .bin /mnt/hgfs/share/
huyue:
@echo $( OBJSs)
@echo $( OBJS)