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?
切记:编译器链接是从文件的头到尾进行链接(从上到下)
答:明确:势必不能用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?
切记:编译器链接是从文件的头到尾进行链接(从上到下)