ARM day3 程序的编译(linux)

来源:互联网 发布:淘宝中国质造怎么加入 编辑:程序博客网 时间:2024/06/08 12:26
4.问:如何编译LED的程序呢?
            答:明确:势必不能用gcc编译(针对于X86架构)
                所以:务必先在上位机部署添加交叉编译器
                上位机添加ARM架构交叉编译器的流程:
                4.1.获取交叉编译器
                resource/编译器/arm-cortex_a9-eabi-4.7-eglibc-2.18.tar
                拷贝到linux和windows共享目录中
                cp arm-cortex_a9-eabi-4.7-eglibc-2.18.tar.gz /opt/
                 
                4.2.上位机添加
                cd /opt/
                tar -xvf arm-cortex_a9-eabi-4.7-eglibc-2.18.tar.gz
                得到新目录:arm-cortex_a9-eabi-4.7-eglibc-2.18
                mv arm-cortex_a9-eabi-4.7-eglibc-2.18 toolchains
                ls /opt/toolchains/bin/
                   arm-cortex_a9-linux-gnueabi-gcc //ARM架构的gcc编译器
                 
                sudo vim /etc/environment
                在PATH中添加/opt/toolchains/bin,例如:
                PATH=/opt/toolchains/bin:...
                保存退出
                 
                重启上位机linux系统
                 
                4.3.测试交叉编译器
                上位机执行:
                arm-cortex_a9-linux-gnueabi-gcc -v //查看交叉编译器的版本
                 
                4.4.交叉编译LED程序
                cd /opt/arm/day03/1.0
                arm-cortex_a9-linux-gnueabi-gcc -nostdlib -c -o led.o led.c
                说明:
                -nostdlib:告诉编译器,此程序不使用标准C库
                -c:只编译不链接
                 
                arm-cortex_a9-linux-gnueabi-ld -nostartfiles -nostdlib  
                                    -Ttext=0x48000000 -o led.elf led.o
                说明:
                arm...ld:链接器
                -nostartfiles:告诉链接器,此代码无需启动文件
                -Ttext=0x48000000:告诉链接器,代码段的起始地址为0x48000000(下位机的内存地址)
                                -o led.elf:链接生成ELF格式的可执行文件
                                切记:此时此刻led.elf不能在没有操作系统的环境中运行
                                
                                arm-cortex_a9-linux-gnueabi-objcopy -O binary led.elf led.bin
                                说明:利用arm...objcopy工具将ELF格式的可执行文件
                                      再次获取到其中的真正的二进制文件信息
                                      led.elf:橘子(带皮)
                                      led.bin:果肉
                                      objcopy:去皮工具
                                       
                                cp led.bin /tftpboot //拷贝到下载目录
                                
                                绝招:反汇编
                                arm-cortex_a9-linux-gnueabi-objdump -D led.elf > led.dis  
                                led.dis:反汇编文件
                                vim led.dis //只需关注一个内容即可
                                <0x48000000>:led_test  
                                如果看到以上信息说明:led_test函数的地址为0x48000000
                                说明程序的编译是对的!
                                
                         5.下位机测试
                           重启下位机,进入uboot命令行模式,执行:
                           ping 192.168.1.8
                           tftp 48000000 led.bin
                           go 48000000
                        
                         6.验证入口地址特性
                           cd /opt/arm/day03/1.0
                           vim led.c //将delay函数的定义放在led_test函数定义的前面
                           保存退出
                           arm-cortex_a9-linux-gnueabi-gcc -nostdlib -c -o led.o led.c
                           arm-cortex_a9-linux-gnueabi-ld -nostartfiles -nostdlib  
                                       -Ttext=0x48000000 -o led.elf led.o
                           arm-cortex_a9-linux-objcopy -O binary led.elf led.bin
                           arm-cortex_a9-linux-objdump -D led.elf > led.dis
                           vim led.dis  
                           查看0x48000000这个地址对应的函数是:led_test?delay?
                            
                           切记:编译器链接是从文件的头到尾进行链接(从上到下)
0 0