搜索
bottom↓
回复: 10
打印 上一主题 下一主题

GCC编译遇到奇葩现象:连接进奇怪的函数内容

[复制链接]

出0入25汤圆

跳转到指定楼层
1
发表于 2019-1-14 23:10:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用gcc编译了个程序,执行不正常,,用objdump提取出反汇编,,发现很奇怪的现象

strcpy的反汇编如下:

一共就8条指令,,基本能看懂程序的执行流程,,这个应该是正常的

strncpy的反汇编如下:

这个一看就很奇怪,,strcpy和strncpy的功能非常类似,,不可能strcpy只需要8条指令,,而strncpy需要这么大一坨啊
而且我看了下Keil环境下的strncpy反汇编,,也是非常简单的,,

还有更奇葩的,,我在ARMv7-M Architecture Reference Manual上查了下ORR指令的编码,如下

ORR指令的最高字节显然应该是EA,,而上面反汇编出来的第一条指令却是e1803001,,最高字节是E1!!

如果说我连接的c标准库不对,,可strcpy的代码又是对的,,

哪位大侠知道这个怎么解决,,望指定

本帖子中包含更多资源

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

x

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

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

出0入442汤圆

2
发表于 2019-1-15 07:06:32 来自手机 | 只看该作者
本帖最后由 wye11083 于 2019-1-15 08:39 编辑

arm高位是有条件码的,所以请相信gcc。再一个,strncpy做了很多额外工作,代码量大点很正常。还有,你说的那个8条指令的不是主函数体,仅仅是一个系统调用罢了。而后者却是个完整的函数体。也就是说,前者在libc库里有实现,后者是c语言扩展库函数,有可能只在libgcc里才有。



我说的不一定对,仅供参考。。thumb没怎么摸过,现在以mips和riscv为主,arm不开源,不用

出0入0汤圆

3
发表于 2019-1-15 07:57:58 来自手机 | 只看该作者
wye11083 发表于 2019-1-15 07:06
arm高位是有条件码的,所以请相信gcc。再一个,strncpy做了很多额外工作,代码量大点很正常。还有,你说的 ...

厉害

出0入25汤圆

4
 楼主| 发表于 2019-1-15 08:53:34 | 只看该作者
wye11083 发表于 2019-1-15 07:06
arm高位是有条件码的,所以请相信gcc。再一个,strncpy做了很多额外工作,代码量大点很正常。还有,你说的 ...


感谢回答

我用的是Cortex-M单片机,,是Thumb-2指令集,,只有B有条件码,其他指令没有,而且条件码在指令编码中是能看到的


我编译的是单片机程序,,没有系统调用,,都是裸机程序,,而且strcpy那8条指令就能完成它的功能,,里面也没有系统调用相关的指令

strncpy和strcpy功能几乎完全一样,,只不过strncpy指定了最多拷贝字符个数,,应该不会复杂很多

本帖子中包含更多资源

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

x

出0入93汤圆

5
发表于 2019-1-15 09:27:17 | 只看该作者
我一眼看过去,以为是正常的,然后用Keil编译了下,发现是真的不正常,O3优化,C微库,CM3芯片反编译出来这个样,看来GCC确实混入了奇怪的东西

不使用C微库,编译出来这个样,代码真长:

本帖子中包含更多资源

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

x

出0入25汤圆

6
 楼主| 发表于 2019-1-15 09:40:50 | 只看该作者
takashiki 发表于 2019-1-15 09:27
我一眼看过去,以为是正常的,然后用Keil编译了下,发现是真的不正常,O3优化,C微库,CM3芯片反编译出来这 ...


多谢验证,,

长些倒没关系,,关键是现在指令是错的,,根本没法执行

出0入25汤圆

7
 楼主| 发表于 2019-1-15 09:46:35 | 只看该作者

我看了下ARM指令集中的ORR指令编码

cond  = 0xE,表示无条件立即执行,,所以最高8位等于0xE1在ARM指令集中确实是一条ORR指令,,

也就是说gcc把ARM的库连接进我的Cortex-M单片机里面去了,,

另外,我用objdump反汇编了一下libc.a,,其中的strncpy如下:确实是ARM指令的,,

本帖子中包含更多资源

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

x

出30入54汤圆

8
发表于 2019-1-15 09:47:05 | 只看该作者
XIVN1987 发表于 2019-1-15 09:40
多谢验证,,

长些倒没关系,,关键是现在指令是错的,,根本没法执行  ...

从上面可以看到你的strncpy不是用thumb2编译的,全部是arm指令,这种情况的一个原因很可能链接错了库文件,前几天我也遇到过类似的情况,换了最新的编译器解决

出0入0汤圆

9
发表于 2019-1-15 10:00:27 | 只看该作者
cloudboy 发表于 2019-1-15 09:47
从上面可以看到你的strncpy不是用thumb2编译的,全部是arm指令,这种情况的一个原因很可能链接错了库文件 ...

会不会是系统里面 装个多个版本 gcc 然后一些Link指错地方了

出0入25汤圆

10
 楼主| 发表于 2019-1-15 11:21:19 | 只看该作者

已经确定是连接了错误的库

在arm-none-eabi\lib下有个libc.a,,是arm指令的;arm-none-eabi\lib\thumb下也有个libc.a,,是thumb指令的

连接器连接strncpy时选择了arm指令的libc.a,,

不过最奇葩的是,,连接strcpy时又是选择的thumb指令的libc.a,,

通过在连接命令中明确指定arm-none-eabi\lib\thumb\libc.a,,编译连接了正确的函数

出0入4汤圆

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

本版积分规则

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

GMT+8, 2024-4-25 10:18

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

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