做平台销售网站,做淘宝客网站一定要备案吗,网站建设进度说明,公司网站建设意见1 现象
程序完全正确#xff0c;但是由于程序链接的位置不对#xff0c;导致程序没有正常运行。
2 寻找原因
对生成的bin文件进行反汇编#xff1a;
arm-linux-gnueabihf-objdump -D -m arm ledc.elf ledc.dis查看生成的反汇编文件 发现在在链接的开始地址处…1 现象
程序完全正确但是由于程序链接的位置不对导致程序没有正常运行。
2 寻找原因
对生成的bin文件进行反汇编
arm-linux-gnueabihf-objdump -D -m arm ledc.elf ledc.dis查看生成的反汇编文件 发现在在链接的开始地址处0x87800000定义了一个名为clk_enable的函数或代码段的起始位置而不是_start程序_start 是一个特殊的符号或标识符它在编译和链接过程中用于表示程序的起始点。。 在我们的start代码中我们初始化了堆栈指针这个程序必须放在链接的起始地址处0x87800000
3 原因
为什么编译后的bin文件没有正确的链接顺序呢经过我的尝试发现是和Makefile中程序的链接顺序有关先写的文件会较早被链接而先写的文件的依赖会更早被链接在这里如果代码顺序如下main.o比start.o先写
# 定义目标文件列表
objs : main.o start.o# 生成目标文件 ledc.bin
ledc.bin : $(objs)arm-linux-gnueabihf-ld -Ttext 0x87800000 -o ledc.elf $^arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $arm-linux-gnueabihf-objdump -D -m arm ledc.elf ledc.dis那么 main.o及其依赖会比start.o先被链接。
4 解决方法
确保每次书写 Makefile 时start.o都写在最前面
# 定义目标文件列表
objs : start.o main.o# 生成目标文件 ledc.bin
ledc.bin : $(objs)arm-linux-gnueabihf-ld -Ttext 0x87800000 -o ledc.elf $^arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $arm-linux-gnueabihf-objdump -D -m arm ledc.elf ledc.dis