搜索
bottom↓
回复: 24

Keil编译出的BIN都是位置有关码吗?

[复制链接]

出0入0汤圆

发表于 2020-5-5 18:03:12 | 显示全部楼层 |阅读模式
做了一个实验,在Keil工程A中写一个函数并指定这个函数的地址,在调试时找到这个地址并把这个函数的二进制码手动COPY到一个数组中。把上次COPY的数组放在Keil工程B中并强制转换成函数指针(类型和工程A中那个函数的类型一样)但是在工程B中调用时就进入硬件错误。用的是STM32F429测试的。另外工程B和工程A的所有设置选项都完全一样比如优化等级 编译器版本。是不是不能搞这种操作

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入8汤圆

发表于 2020-5-5 19:33:45 来自手机 | 显示全部楼层
可以,但是A要用B的runtime编译

出0入0汤圆

发表于 2020-5-5 19:46:26 来自手机 | 显示全部楼层
应该在A和B中都把这个函数定位到同一个地方,空间留大点。当然A和B的设置要一样。如果函数定位后输出bin,然后比较一下bin对应位置的内容,如果一致,那么不会出错吧?

出0入984汤圆

发表于 2020-5-5 19:49:10 | 显示全部楼层
要共用的部分生成lib/.a更方便吧

出0入0汤圆

 楼主| 发表于 2020-5-5 20:04:33 | 显示全部楼层
canspider 发表于 2020-5-5 19:33
可以,但是A要用B的runtime编译

runtime编译是什么意思网上查了一下也没找到

出0入0汤圆

 楼主| 发表于 2020-5-5 20:06:45 | 显示全部楼层
TANK99 发表于 2020-5-5 19:46
应该在A和B中都把这个函数定位到同一个地方,空间留大点。当然A和B的设置要一样。如果函数定位后输出bin, ...

就是不在同一个地址,到时候我试试把数组放在工程A定位的地址试试,如果都在同一个地址应该可以吧。不过这样用的时候限制就很多了。

出0入0汤圆

 楼主| 发表于 2020-5-5 20:07:16 | 显示全部楼层
Himem 发表于 2020-5-5 19:49
要共用的部分生成lib/.a更方便吧

是的 我就这样来折腾一下

出0入984汤圆

发表于 2020-5-5 20:13:53 | 显示全部楼层
本帖最后由 Himem 于 2020-5-5 20:23 编辑
Xy201207 发表于 2020-5-5 20:06
就是不在同一个地址,到时候我试试把数组放在工程A定位的地址试试,如果都在同一个地址应该可以吧。不过 ...


那看看这个函数其中是不是调用了其他子函数或全局变量一类?

记得B/BL指令都是相对地址定位,把用到的函数编译时想办法都凑到一起,生成的整块机器码拿走后是能放到任意新位置用的

出0入0汤圆

发表于 2020-5-5 20:27:11 | 显示全部楼层
本帖最后由 f1yh1347 于 2020-5-5 20:28 编辑

仔细看看你的数组地址是奇地址还是偶地址?cortex-m是thumb指令集吧?跳转地址应该是奇数吧?如果数组首地址是偶数,你跳转到偶地址,应该会hard fault.
你可以做个测试 ,把代码拷贝到项目A数组中,直接跳到A数组,应该也会hard fault.

出0入984汤圆

发表于 2020-5-5 20:29:04 | 显示全部楼层
本帖最后由 Himem 于 2020-5-5 20:30 编辑
f1yh1347 发表于 2020-5-5 20:27
仔细看看你的数组地址是奇地址还是偶地址?cortex-m是thumb指令集吧?跳转地址应该是奇数吧?如果数组首地 ...


一般来说全局数组首地址都会4字节align吧

出0入0汤圆

发表于 2020-5-5 20:30:13 | 显示全部楼层
Himem 发表于 2020-5-5 20:29
一般来说全局数组首地址都会4字节align吧

也要看数组类型!

出0入0汤圆

 楼主| 发表于 2020-5-5 22:02:50 | 显示全部楼层
Himem 发表于 2020-5-5 20:13
那看看这个函数其中是不是调用了其他子函数或全局变量一类?

记得B/BL指令都是相对地址定位,把用到的函 ...

没有,我就是简单求个和 传入一个数组和长度 返回一个求和的值。看来还是要研究汇编啊 。非常感谢

出0入0汤圆

 楼主| 发表于 2020-5-5 22:03:10 | 显示全部楼层
f1yh1347 发表于 2020-5-5 20:27
仔细看看你的数组地址是奇地址还是偶地址?cortex-m是thumb指令集吧?跳转地址应该是奇数吧?如果数组首地 ...

好的,谢谢提醒

出0入8汤圆

发表于 2020-5-5 22:11:20 来自手机 | 显示全部楼层
Xy201207 发表于 2020-5-5 20:04
runtime编译是什么意思网上查了一下也没找到

网上搜不到的话那就不要折腾了,后面你会发现有填不完的坑

出105入79汤圆

发表于 2020-5-5 23:54:14 | 显示全部楼层
程序和数据可以混用吗?

出0入0汤圆

发表于 2020-5-6 07:38:00 来自手机 | 显示全部楼层
keil有个RI的选项,

出0入0汤圆

发表于 2020-5-6 09:03:45 | 显示全部楼层
可以在A中将所有要调用的函数做一个地址数组,在B中直接调用

出0入0汤圆

发表于 2020-5-6 10:30:05 来自手机 | 显示全部楼层
两个工程,函数的地址要一样

出0入0汤圆

 楼主| 发表于 2020-5-6 10:51:37 | 显示全部楼层
tangnyzl 发表于 2020-5-6 07:38
keil有个RI的选项,

同样没在网上找到,能不能详细说说...

出0入0汤圆

 楼主| 发表于 2020-5-6 10:52:27 | 显示全部楼层
lxhu 发表于 2020-5-6 10:30
两个工程,函数的地址要一样

这样的话就是位置有关码了,不知道可不可以这样理解...

出0入0汤圆

 楼主| 发表于 2020-5-6 10:56:35 | 显示全部楼层
qwe2231695 发表于 2020-5-5 23:54
程序和数据可以混用吗?

程序和数据区分是给人看的。对CPU来说你给它二进制码它能识别它就执行不能识别它就返回错误。CPU不管你这二进制码是程序或者所谓的数据。

出0入0汤圆

发表于 2020-5-6 11:14:11 | 显示全部楼层
Xy201207 发表于 2020-5-6 10:51
同样没在网上找到,能不能详细说说...

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2020-5-6 12:12:43 | 显示全部楼层
Xy201207 发表于 2020-5-6 10:52
这样的话就是位置有关码了,不知道可不可以这样理解...


是的,默认都是位置相关的。有关位置无关的代码,可以参考编译器的手册。http://infocenter.arm.com/help/i ... 203hc/Chdhhjjb.html

出0入0汤圆

发表于 2020-5-6 16:40:09 | 显示全部楼层
变量位置不同,最好是生成库

出0入0汤圆

 楼主| 发表于 2020-5-6 22:27:14 | 显示全部楼层
竟然可以!只是函数编译生存的二进制前面都有一个0x00,然后再强制转换的时候从第个元素开始就好了。简单的写了一个求和函数里面没调用其他函数。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 01:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表