当前位置: 首页 > news >正文

【踩坑日记】I.MX6ULL裸机启动时由于编译的程序链接地址不对造成的程序没正确运行

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.ostart.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
http://www.lryc.cn/news/373214.html

相关文章:

  • 【计算机网络仿真实验-实验2.6】带交换机的RIP路由协议
  • Apache网页优化
  • OpenCV形态学
  • 首途第三十三套清新简约卡片风格蓝紫渐变色短视频模板 | 苹果CMSV10主题
  • 永磁同步直线电机(PMLSM)控制与仿真2-永磁同步直线电机数学模型搭建
  • MPLS VPN一
  • 39python数据分析numpy基础之h5py读写数组数据到h5文件
  • 2024全新仿麻豆视频苹果cms源码v10影视模板
  • 这世上又多了一只爬虫(spiderflow)
  • SpringMVC框架学习笔记(七):处理 json 和 HttpMessageConverter 以及文件的下载和上传
  • 八、BGP
  • 有监督学习——支持向量机、朴素贝叶斯分类
  • 自动化测试文档
  • vue-i18n使用步骤详解(含完整操作步骤)
  • XXE漏洞修补:保护您的系统免受XML外部实体攻击
  • 去除upload的抖动效果
  • 什么是 Linux ?(Linux)
  • uni-app 怎么在tabbar使用阿里图标库
  • 勒索病毒剖析
  • 【C++11】第一部分(一万六千多字)
  • FPGA专项课程即将开课,颁发AMD官方证书
  • C++ shared_ptr
  • 2024.6.15
  • 堆栈溢出的攻击 -fno-stack-protector stack smash 检测
  • 掌握特劳特定位理论核心,明晰企业战略定位之重
  • RAGFlow 学习笔记
  • 使用Docker-Java监听Docker容器的信息
  • Spring Boot + Mybatis Plus实现登录注册
  • IDEA创建web项目
  • 二手物品交易系统的设计