我们知道在C语言编译时,有那么几个常用的优化编译选项,分别是-O0,-O1,-O2,-O3以及-Os。之前一直觉得既然是优化选项,顶多是优化一下逻辑,提高一些效率或者减少一下程序大小而已。很少会觉得它们会影响程序的最终结果。直到最近在ARM平台上发现一个程序里的一个bug,才觉得这些优化选项有时候也没那么智能。或者说针对ARM平台,还没有那么智能。

首先看这么一段程序,此程序是我将问题简单化的程序:

#include

#include

int main()

{

char buffer[1024] = {0,1,2,3,4,5,6,7};

int iTest = 0x12345678;

int *p = (int *)(buffer + 7);

memcpy(p, &iTest, sizeof(iTest));

printf("%x\n", buffer[6]);

printf("%x\n", buffer[9]);

return 0;

}

乍看之下,觉得这个程序没啥问题。然后我们将此程序文件名称叫point.c。然后分别用交叉编译链进行如下编译:

arm-xxx-linux-gcc point.c -o point0 -O0

arm-xxx-linux-gcc point.c -o point1 -O1

arm-xxx-linux-gcc point.c -o point2 -O2

最终再分别执行三个程序,结果却有点出人意料:

./point0

6

34

./point1

34

0

./point2

6

0

只有在-O0,也就是没有优化的情况下,结果才和假想的一致。但是同样的问题在x86平台上却没有问题。

于是我通过用以下命令,分别来生成不同优化选项下的汇编代码,来确定在ARM平台上编译到底出了什么问题。

arm-xxx-linux-gcc point.c -o point0.s -O0 -S

arm-xxx-linux-gcc point.c -o point1.s -O1 -S

arm-xxx-linux-gcc point.c -o point2.s -O2 -S

然后对比三个汇编的代码,发现问题出在memcpy这句话上。

在point0.s中,程序是老老实实的调用的memcpy,然后就将0x12345678老老实实按照字节一个个的放到了buffer+7的位置。

而在point1.s中程序则是没有调用memcpy,而是用的语句:

str        r3, [sp, #7]

而此时r3中存储的就是0x12345678;而由于我采用的ARM平台是32位的,此语句执行时,地址线应该不会发生变化,所以最终的结果是buffer+4到buffer+7的数据被覆盖了,而不是buffer+7到buffer+10的数据被修改。

而在point2.s中,貌似又针对流水线进行了优化,程序执行顺序会有所变化,在对buffer部分位置赋初值的顺序是在str  r3, [sp, #7]之后,所以buffer+6处的数据反而是正确的6。

分析到这儿,也许有人会说写个简单的程序,都会因为编译的优化选项不同导致结果不同,那这memcpy是不是就不敢用了?

其实一般只要有较好的编程习惯的话,都不会遇到此类问题,比如下面的程序:

#include

#include

int main()

{

char buffer[1024] = {0,1,2,3,4,5,6,7};

int iTest = 0x12345678;

char *p = buffer + 7;

memcpy(p, &iTest, sizeof(iTest));

printf("%x\n", buffer[6]);

printf("%x\n", buffer[9]);

return 0;

}

这段程序其实只是简单的改变了p的类型,就能保证在各种优化下,结果都一样。可见好的编程习惯是有多么的重要。

arm平台下linux c语言编程,简单分析针对ARM平台的C语言程序的编译问题相关推荐

  1. linux程序卸载动态库,Intel平台下linux中ELF文件动态链接的加载、解析及实例分析(二): 函数解析与卸载...

    在 IBM Bluemix 云平台上开发并部署您的下一个应用. 相信读者已经看过了 Intel平台下Linux中ELF文件动态链接的加载.解析及实例分析(一): 加载的内容了,了解了ELF文件被加载的 ...

  2. linux上备份sybase,Linux平台下Sybase数据库备份的方法分析

    龙源期刊网 http://doc.xuehai.net Linux平台下Sybase数据库备份的方法分析 作者:刘君尧王辉静刘云霞 来源:<无线互联科技>2018年第01期 摘要:对于从事 ...

  3. c语言编程技巧分析,C语言难点及编程技巧分析

    摘要:近些年信息技术发展迅速,社会需要大量专业的计算机人才,C语言是学习计算机知识的专业理论课程,能够为以后的学习打下专业基础.但目前C语言学习受到各方面因素的影响,学习效果不是很理想,很多时候即使努 ...

  4. C语言编程>第二十二周 ③ 下列给定的程序中,函数fun的功能是根据整型形参n,计算如下公式的值:

    例题:下列给定的程序中,函数fun的功能是根据整型形参n,计算如下公式的值: 例如,若n=1000,则应输出0.000155. 注意:不要改动main函数,不能增行或删行,也不能更改程序的结构. 代码 ...

  5. Linux的SOCKET编程 简单演示

    转载:http://blog.csdn.net/hguisu/article/details/7445768/ Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源 ...

  6. 基于ARM平台下的GPRS/CQT测试系统设计研究

    GPRS作为中国移动据数业务的承载网,支持多种数据业务,涉及不同的网元,任何一个网元出故障都会直接影响数据业务的正常使用,保证用户端到端使用就显得非常重要. GPRSDT/CQT测试模拟终端用户的使用 ...

  7. Linux·内核源码简单分析

    目录 系统总体流程: 各个目录的阅读总结: (一) boot (二)内核初始化init (三)kernel: (四)mm内存管理 (五)文件系统模块fs: 系统总体流程: 系统从boot开始动作,把内 ...

  8. Linux系统调用getuid的简单分析

    陈铁 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000. Linux内核启 ...

  9. c语言编程定位的计算机,高校计算机专业C语言教学的四个定位

    高校计算机专业C语言教学的四个定位 来源:用户上传 作者: 姜晓峰 摘 要:本文所讨论的是高校计算机专业C语言教学的课程性质.教学目标.教学内容.教学理念四个方面的定位问题.作者从教学的实际情况,目前 ...

最新文章

  1. IDEA 出现 updating indices 卡进度条问题的解决方案并加快索引速度
  2. python爬取音乐_利用Python对网易云音乐进行爬取!无所不爬的爬虫啊!
  3. Docker上安装jenkins让持续集成飞
  4. linux添加源地址ping,实战经验:Linux Source NAT在Ping场景下的应用
  5. 基于CentOS 7 安装Percona XtraDB Cluster(PXC) 5.7
  6. hex文件matlab处理,基于MATLAB生成Intel HEX文件
  7. Android 系统(275)---Mtk Webview基本问题
  8. 容器安全 - 非特权/非root用户运行容器,提升容器的运行安全
  9. python判断不等_Python爬取620首虾米歌曲,揭秘五月天为什么狂吸粉?!
  10. 静态网页制作前夕小记录
  11. 高性能至强融核服务器,剖析两大至强融核产品规格_Intel服务器CPU_服务器评测与技术-中关村在线...
  12. 计算机进入vga模式,VGA模式是什么,怎么进入VGA模式
  13. UG二次开发GRIP修改颜色
  14. 计算机各键的名称和作用,space是什么键 键盘键位名称及功用详解
  15. VCC、 VDD、VEE、VSS 电压理解
  16. A Java Runtime Environment (JRE) or Java Development Kit (JDK)...
  17. 一季度,亏损超7亿!阿里的“亲儿子”百世物流怎么了?
  18. Python倒叙的几种方法
  19. 学习ROS常用的官方网站,学习资源整理
  20. EtherCAT是如何工作的

热门文章

  1. 使⽤用 Spring Boot Actuator 监控应⽤
  2. buffer string builder简单说明
  3. Linux系统中安装软件的三种方法(二)
  4. MySQL与PostgreSQL比较,哪个更好、我们该选用哪个?
  5. Java多线程学习四十三:
  6. docker环境,搭建kafka集群
  7. Docker上搭载Solr,重新编辑加载文件的相关命令
  8. SpringMVC框架----SpringMVC的自定义类型转换器
  9. 程序设计与算法----分治之归并排序
  10. GitBook的使用方式,快速创建网页文档