工程中编写自己的makefile---3 交叉编译工具

1        交叉编译工具

一个C/C++文件要经过预处理(preprocessing),编译(compilation),汇编(assembly),连接(linking);

1.1             概述

1,预处理

         .c  >> .i

         将要包含(include)的文件插入源文件中,将宏定义展开,根据条件编译命令选择要使用的代码,最后将这些代码输出到一个”.i”文件中等待进一步处理;一般用到arm-linux-cpp

2,编译

         .i  >> .s

         把C/C++的代码(比如上面的”.i”文件)”翻译”成汇编代码,所用到的工具是 ccl

3,汇编

         .s  >> .o

         将上一步中的汇编代码翻译成符合一定格式的机器可识别但不能执行的机器代码,在linux系统上一般表现为 .o 后缀的目标文件(OBJ文件),用到的工具是arm-linux-as ; ”反汇编”是指将机器代码装换为汇编代码,在调试程序时常用到;

4,连接

       .o  >>  elf

         将多个 .o 文件和系统库文件链接成为可在特定平台运行的可执行文件,(linux下为ELF格式),用到的工具为 arm-linux-ld

1.2             arm-linux-gcc选项

1.2.1        总体选项

1-o  file

指定输出的文件为file; 但只能指定一个输出文件;

 

2-c

         输出 .o 文件

编译或汇编源文件,但不做连接,编译器输出对应于源文件的目标文件,默认情况下,GCC通过使用”.o”替代源文件名的后缀”.c”,”.i”,”.s”等,产生OBJ文件名; 可以使用”-o”选项选择其他的名字;

gcc 忽略 –c 选项后面任何无法识别的输入文件(不编译或汇编)

 

3,-S

         输出 .s 文件

编译后即停止,不进行汇编,对于每个输入的非汇编语言文件,输出结果是汇编语言文件; 默认情况下,GCC通过使用”.s”替代源文件名的后缀”.c”,”.i”,等,产生汇编文件名; 可以使用”-o”选项选择其他的名字;

 

4,-E

输出 .i 文件

         预处理后即停止,不进行编译,预处理后的代码送往标准输出;

 

5,-v

         显示制作GCC工具自身时的配置命令,同时显示编译器驱动程序,预处理器,编译器的版本号;

 

6,-pipe

在编译过程的不同阶段间使用管道而非临时文件进行通信

 

7,-x        language

明确指出后面输入文件的语言为 language (而不是从文件后缀得到默认选择)

警告选项

 

8-Wall

         基本打开了所有需要注意的警告信息;

 

9,调试选项

         -g

         以操作系统的本地格式(stabs,COFF, XCOFF,或DWARF).产生调试信息. GDB能够使用这些调试信息.

 

10,优化选项

         -O,-O0,-O1,-O2,-O4,优化;

1.2.2        连接器选项

         下面的选项用于连接OBJ文件,输出可执行文件或库文件;

1,object-file-name

         gcc  -o test  main.o  sub.o    其中: main.o  sub.o就是输入的文件

 

2-l(小写l)library

    连接名为library的库文件,常接”-L”指定的库搜索路径; 指定期望连接的库的名字,注意!!!文件的顺序就是链接的顺序

 

3,-nostartfiles

         不连接系统标准启动文件,而标准库文件仍然正常使用,在编译bootloader,内核时将用到这个选项;

 

4,-nostdlib

         不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器,在编译bootloader,内核时将用到这个选项;

 

5-static

         连接静态库是使用该选项

 

6-shared

         生成一个共享OBJ文件,他可以和其他OBJ文件连接产生可执行文件,当不想以源代码发布程序时,使用”-shared”选项生成库文件;

1.2.3        目录选项

1I(大写i)dir

         在头文件的搜索路径列表中添加dir目录

 

2L(大写l)dir

常接”-L”指定的库文件搜索路径

1.2.4        库选项

参考4.1.1节

1.3             arm-linux-ld选项

arm-linux-ld 用于将多个目标文件,库文件连接成可执行文件,

1.4             arm-linux-objcopy选项

        用来复制一个目标文件的内容到另一个文件中;可以使用不同的源文件格式来输出目的文件,及可以进行格式转换;

1,Input-file  outfile

         分别表示输入目标文件(源目标文件)和输出目标文件(目的目标文件);如果没有明确指出输出目标文件,则将输出目标文件覆盖到输入目标文件;

 

2,-I bfdname或--input-target=bfdname

         用来指明源文件格式;

 

3,-O bfdname或--output-target=bfdname

用来指明目标文件格式;

 

4,-F bfdname--target=bfdname

         指明源文件格式目标文件格式,只进行复制不转换;

 

5,-S 或 --strip-all

         不从源文件中复制重定位信息和符号信息到目标文件中去

6,-g 或--strip-debug

         不从源文件中复制调试符号到目标文件中去

1.5             arm-linux-objdump选项

用于显示二进制文件信息,常用来查看反汇编代码;

1,-b  bfdname

         指定目标码格式,

2,-d

         反汇编可执行段

3,-D

         反汇编所有段

4,-f

         显示文件的整体头部摘要信息;

5,-h

         显示文件的各个段头部摘要信息;

6,-i

         显示支持的目标文件格式和CPU架构,他们在“-b”“-m”选项中用到

7,-m machine

         指定反汇编目标文件时使用的架构;

例如:

将ELF格式的文件转换为反汇编文件

         arm-linux-objdump–D  elf_file > dis_file

将二进制文件转换为反汇编文件

         Arm-linux-objdump–D  –b binary  –m arm bin_file>dis_file

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
创建一个stm32 makefile工程,可以按照以下步骤进行操作: 1. 确定芯片型号:选择使用的stm32系列芯片型号,例如stm32f103c8t6。 2. 准备开发环境:安装好交叉编译工具链和stlink调试工具。 3. 创建工程目录:在电脑上创建一个工程目录,例如~/stm32_project。 4. 创建makefile文件:在工程目录下创建一个makefile文件,例如~/stm32_project/makefile。 5. 编写makefile文件:根据芯片型号和开发需求,编写makefile文件,例如: ```makefile # makefile文件 # 编译器和链接器 CC = arm-none-eabi-gcc LD = arm-none-eabi-ld # 编译选项 CFLAGS = -mcpu=cortex-m3 -mthumb -Wall -g -O0 LDFLAGS = -T stm32.ld # 源文件和目标文件 SRC = main.c stm32_startup.c OBJ = $(SRC:.c=.o) # 目标文件名 TARGET = stm32_project # 编译规则 all: $(TARGET).bin $(TARGET).elf: $(OBJ) $(LD) $(LDFLAGS) -o $@ $^ $(TARGET).bin: $(TARGET).elf arm-none-eabi-objcopy -O binary $^ $@ %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< clean: rm -f $(OBJ) $(TARGET).elf $(TARGET).bin ``` 6. 编写应用程序:在工程目录下编写应用程序,例如~/stm32_project/main.c。 7. 编译应用程序:在终端进入工程目录,执行make命令编译应用程序,例如: ```shell cd ~/stm32_project make ``` 8. 烧录程序:使用stlink调试工具烧录程序到stm32芯片,例如: ```shell st-flash write stm32_project.bin 0x8000000 ``` 以上就是创建一个stm32 makefile工程的基本步骤。需要注意的是,具体的makefile文件内容和编译选项可能需要根据具体的开发需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值