问题解决于该网站


首先讲一下问题是怎么发生的:

最近在学计算机系统,用到的教材是32位的Linux系统,而在我的64位的Ubuntu上,我想以gcc编译出32位的程序并查看其汇编代码,于是百度查了下,应在gcc中使用-m32的选项

test.c:
int add(int x, int y) {return x+y;
}
int caller() {int t1 = 125;int t2 = 80;int sum = add(t1, t2);return sum;
}

于是我便使用以下两个命令来得到test.c的汇编代码:

gcc -c test.c -m32
objdump -d test.o

得到的反汇编得到的代码为:

$ gcc -c test.c -m32
$ objdump -d test.otest.o:     文件格式 elf32-i386Disassembly of section .text:00000000 <add>:0:   55                      push   %ebp1:   89 e5                   mov    %esp,%ebp3:   e8 fc ff ff ff          call   4 <add+0x4>          # 多余代码8:   05 01 00 00 00          add    $0x1,%eax         # 多余代码d:   8b 55 08                mov    0x8(%ebp),%edx10:   8b 45 0c                mov    0xc(%ebp),%eax13:   01 d0                   add    %edx,%eax15:   5d                      pop    %ebp16:   c3                      ret    00000017 <caller>:17:   55                      push   %ebp18:   89 e5                   mov    %esp,%ebp1a:   83 ec 10                sub    $0x10,%esp1d:   e8 fc ff ff ff          call   1e <caller+0x7>        # 多余代码22:   05 01 00 00 00          add    $0x1,%eax            # 多余代码27:   c7 45 f4 7d 00 00 00    movl   $0x7d,-0xc(%ebp)2e:   c7 45 f8 50 00 00 00    movl   $0x50,-0x8(%ebp)35:   ff 75 f8                pushl  -0x8(%ebp)         38:   ff 75 f4                pushl  -0xc(%ebp) 3b:   e8 fc ff ff ff          call   3c <caller+0x25>40:   83 c4 08                add    $0x8,%esp  43:   89 45 fc                mov    %eax,-0x4(%ebp)46:   8b 45 fc                mov    -0x4(%ebp),%eax49:   c9                      leave  4a:   c3                      ret    # 下面的啥玩意儿?
Disassembly of section .text.__x86.get_pc_thunk.ax:00000000 <__x86.get_pc_thunk.ax>:0:   8b 04 24                mov    (%esp),%eax3:   c3                      ret

发现有很多不符合预期的明显是多余的汇编代码,于是搜索.text.__x86.get_pc_thunk.ax找到了解决办法

解决办法:

在gcc命令中使用-fno-pie选项

gcc -c test.c -m32 -fno-pie

objdump -d test.o

于是去掉了多余代码,得到的了符合预期的汇编代码:

$ gcc -c test.c -m32 -fno-pie
$ objdump -d test.otest.o:     文件格式 elf32-i386Disassembly of section .text:00000000 <add>:0:   55                      push   %ebp1:   89 e5                   mov    %esp,%ebp3:   8b 55 08                mov    0x8(%ebp),%edx6:   8b 45 0c                mov    0xc(%ebp),%eax9:   01 d0                   add    %edx,%eaxb:   5d                      pop    %ebpc:   c3                      ret    0000000d <caller>:d:   55                      push   %ebpe:   89 e5                   mov    %esp,%ebp10:   83 ec 10                sub    $0x10,%esp13:   c7 45 f4 7d 00 00 00    movl   $0x7d,-0xc(%ebp)1a:   c7 45 f8 50 00 00 00    movl   $0x50,-0x8(%ebp)21:   ff 75 f8                pushl  -0x8(%ebp)24:   ff 75 f4                pushl  -0xc(%ebp)27:   e8 fc ff ff ff          call   28 <caller+0x1b>2c:   83 c4 08                add    $0x8,%esp2f:   89 45 fc                mov    %eax,-0x4(%ebp)32:   8b 45 fc                mov    -0x4(%ebp),%eax35:   c9                      leave  36:   c3                      ret

具体原因不想深究,想深究看开头的网站或者搜索.text.__x86.get_pc_thunk.ax去了解

在64位的Linux系统使用gcc的-m32选项编译32位的程序得到了多余的代码(多余指令call和add)、有多余的.text.__x86.get_pc_thunk.ax相关推荐

  1. 64位linux,sizeof(int),C中sizeof()的用法——32位和64位下的sizeof()

    机器平台:X86_64 处理器 操作系统:Red Hat 4.1.2-14 编译器: gcc version 4.1.2 20070626 Size of char is:               ...

  2. 查看linux版本32还是64位,查看linux系统版本是32位的还是64位的

    一. [root@linuxzgf ~]#getconf LONG_BIT [root@linuxzgf ~]#getconf WORD_BIT (32位的系统中int类型和long类型一般都是4字节 ...

  3. 在64位linux下编译32位程序

    一般情况下我们最好是在一个平台上编译本平台的二进制程序,比如在32位平台上编译32位程序而在64位平台上编译64位程序. 现在64位的系统(这里主要指x86_64系统,包括AMD64和Intel的EM ...

  4. Boost在Linux和windows下的编译 32位 64位

    一 简言 1. Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一 2. Boost官网地址:http://www.boost.org/ 3. 本博客示 ...

  5. 64位的GCC 编译32位程序

    64位的GCC 编译32位程序 编译32的程序,只需要加上-m32就可以了 gcc -m32 llong.c 但是提示下面的错误 /usr/bin/ld: 当搜索用于 /usr/lib/gcc/x86 ...

  6. Problem 64 如何设置Linux系统内存回收的阀值?

    Problem 64 如何设置Linux系统内存回收的阀值? Ans: Linux内核的策略是最大程度的利用内存cache 文件系统的数据,提高IO速度,虽然在机制上是有进程需要更大的内存时,会自动释 ...

  7. Linux系统下GCC编译错误:“undefined reference to ‘sqrt‘”

    Linux系统下GCC编译错误:"undefined reference to 'sqrt'",解决方法:-lm 数学函数sqrt()位于libm.so库文件中(这些库文件通常位于 ...

  8. 骁龙660是32位还是64位_微软公布v2004最低处理器要求,放弃32位系统,你的CPU还能支持吗?...

    最近关于win10 20H1(win10更新五月版)的消息铺天盖地席卷而来,据说只有开发者用户可以先行在MSDN订阅网站下载该版本的ISO镜像文件,对于主流消费者而言,预计要再煎熬等到28日. 而且微 ...

  9. win10子系统linux下cmake编译32位程序

    文章目录 Ubuntu 18运行32位程序 添加软件源 安装编译环境 编写CMakeLists.txt cmake编译 运行程序 SUSE 15.0运行32位程序 m32编译 添加软件源 安装qemu ...

最新文章

  1. 一键cosplay各路动漫人物!快手的这个BlendGAN火了 | NeurIPS 2021
  2. 经过五年测试 维基利用HTML5迈入视频时代
  3. curl获取网页内容出现乱码或为空的解决方案,另附curl_getinfo函数解析
  4. asp.net2.0导出pdf文件完美解决方案(转载)
  5. 代码演示:先来后到的特例、优劣、源码分析
  6. STM32上使用JSON
  7. python库路径_如何设置本地python库目录/ PYTHONPATH?
  8. spring集成quartz框架
  9. 《Go语言实战》读书笔记——关于Go语言的介绍
  10. 【前端第七课】媒体查询的语法;移动端适配相关知识点;Grid高级布局
  11. cat << EOF 什么意思?
  12. 二叉树线索化(C语言)
  13. 磁盘存储链式的B树与B+树
  14. Qt在线安装器下载快的办法
  15. 书论91 万经《分隶偶存》
  16. EtherCat主站与从站简介
  17. 如何一次性删除PPT中所有动画效果?
  18. python 全自动化爬取必应图片
  19. javascript超空间(removeChild和innerHTML区别)
  20. 使用帕累托最优选择解释涌现现象

热门文章

  1. android 全景拼接软件,这款全景图片拼接软件很强大
  2. 获取上一个自然周的、上一个自然月的起始时间范围
  3. 使用计算机时按什么键打开,计算机进入BIOS的快捷键是什么|打开计算机以进入BIOS设置时按下的键...
  4. 看懂需要勇气,33张人性图!
  5. [转]Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
  6. 基于TCGA及SEER等癌症公共数据库的深度挖掘和科研设计会议
  7. 黄油刀的配置与使用——个人学习记录
  8. Unity3D模型 | SolidWorks建模导入Unity
  9. 精益看板方法从理论到实战 (5)—— 控制在制品数量(上)
  10. ACM javaIO 快速 读写