Linux编译工具:gcc入门
1、gcc -g -c led.s -o led.o 编译文件
“ -g”选项是产生调试信息, GDB 能够使用这些调试信息进行代码调试。
“ -c”选项是编译源文件,但是不链接。
“ -o”选项是指定编译产生的文件名字。
2、ld -Ttext 0X87800000 led.o -o led.elf 链接文件
-Ttext 就是指定链接地址。
“ -o”选项指定链接生成的 elf 文件名,这里我们命名为 led.elf。
.map 文件就详细的描述了各个.o 文件都是链接到了什么地址。
“存储地址”就是可执行文件存储在哪里,可执行文件的存储地址可以随意选择。
“运行地址(链接地址)”就是代码运行的时候所处的地址。
3、objcopy -O binary -S -g led.elf led.bin 格式转换
“ -O”选项指定以什么格式输出,后面的“ binary”表示以二进制格式输出。
“ -S”表示不要复制源文件中的重定位信息和符号信息。
“ -g”表示不复制源文件中的调试信息。
4、objdump -D led.elf > led.dis 反汇编
“ -D”选项表示反汇编所有的段,反汇编完成以后就会在当前目录下出现一个名为 led.dis 文件。
5、编译时“-nostdlib”的使用
在韦东山的mmu实验的 Makefile 中出现:
arm-linux-ld: firtst has both ordered [`.ARM.exidx' in init.o] and unordered [`.ARM.extab' in init.o] sections
arm-linux-ld: final link failed: Bad value
此常见的错误的原因是:
编译时加上选项(-nostdlib)
-nostdlib
不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。这个选项常用于编译内核、bootloader等程序,
它们不需要启动文件、标准库文件。
C语言程序执行的第一条指令。并不是main函数。生成一个C程序的可执行文件时编译器通常会在我们的代码上加上几个被称为启动文件的代
crt1.o,crti.o,crtend.o,crtn.o等,他们是标准库文件。这些代码设置C程序的堆栈等,然后调用main函数。他们依赖于操作系统,在裸板上无法执行,
所以我们自己写一个。
所以,我们自己写的*.S汇编文件就是一个启动文件,它设置好堆栈后调用main函数。因此,我们不需要系统自带的启动文件。
因此 我们只需修改其Makefile文件:
%.o:%.c
arm-linux-gcc -Wall -nostdlib -O2 -c -o $@ $<
%.o:%.S
arm-linux-gcc -Wall -nostdlib -O2 -c -o $@ $<
再次make 就ok啦。
6、在连接程序的时候指定第三方库所在的目录
因为在 bsp_uart.c 中有个函数uart_setbaudrate,在此函数中使用到了除法运算,因此在链接的时候需要将编译器的数学库也链
接进来。
Makefile 在链接的时候使用选项“ -L”来指定库所在的目录,比如变量 LIBPATH 就是指定了我们所使用的编译器库所在的目录。
LIBPATH := -lgcc -L /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/lib/gcc/arm-linux-gnueabihf/4.9.4
$(TARGET).bin : $(OBJS)
$(LD) -Timx6ul.lds -o $(TARGET).elf $^ $(LIBPATH)
$(OBJCOPY) -O binary -S $(TARGET).elf $@
$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis
7、选项“ -fno-builtin”
加入了选项“ -fno-builtin”,否则编译的时候提示“ putc”、“ puts”
这两个函数与内建函数冲突,错误信息如下所示:
warning: conflicting types for built-in function ‘ putc’
warning: conflicting types for built-in function ‘ puts’
在编译的时候加入选项“ -fno-builtin”表示不使用内建函数,这样我们就可以自己实现 putc
和 puts 这样的函数了。
$(SOBJS) : obj/%.o : %.S
$(CC) -Wall -nostdlib -fno-builtin -c -O2 $(INCLUDE) -o $@ $<
$(COBJS) : obj/%.o : %.c
$(CC) -Wall -nostdlib -fno-builtin -c -O2 $(INCLUDE) -o $@ $<