在64位的Linux系统使用gcc的-m32选项编译32位的程序得到了多余的代码(多余指令call和add)、有多余的.text.__x86.get_pc_thunk.ax
问题解决于该网站
首先讲一下问题是怎么发生的:
最近在学计算机系统,用到的教材是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相关推荐
- 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: ...
- 查看linux版本32还是64位,查看linux系统版本是32位的还是64位的
一. [root@linuxzgf ~]#getconf LONG_BIT [root@linuxzgf ~]#getconf WORD_BIT (32位的系统中int类型和long类型一般都是4字节 ...
- 在64位linux下编译32位程序
一般情况下我们最好是在一个平台上编译本平台的二进制程序,比如在32位平台上编译32位程序而在64位平台上编译64位程序. 现在64位的系统(这里主要指x86_64系统,包括AMD64和Intel的EM ...
- Boost在Linux和windows下的编译 32位 64位
一 简言 1. Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一 2. Boost官网地址:http://www.boost.org/ 3. 本博客示 ...
- 64位的GCC 编译32位程序
64位的GCC 编译32位程序 编译32的程序,只需要加上-m32就可以了 gcc -m32 llong.c 但是提示下面的错误 /usr/bin/ld: 当搜索用于 /usr/lib/gcc/x86 ...
- Problem 64 如何设置Linux系统内存回收的阀值?
Problem 64 如何设置Linux系统内存回收的阀值? Ans: Linux内核的策略是最大程度的利用内存cache 文件系统的数据,提高IO速度,虽然在机制上是有进程需要更大的内存时,会自动释 ...
- Linux系统下GCC编译错误:“undefined reference to ‘sqrt‘”
Linux系统下GCC编译错误:"undefined reference to 'sqrt'",解决方法:-lm 数学函数sqrt()位于libm.so库文件中(这些库文件通常位于 ...
- 骁龙660是32位还是64位_微软公布v2004最低处理器要求,放弃32位系统,你的CPU还能支持吗?...
最近关于win10 20H1(win10更新五月版)的消息铺天盖地席卷而来,据说只有开发者用户可以先行在MSDN订阅网站下载该版本的ISO镜像文件,对于主流消费者而言,预计要再煎熬等到28日. 而且微 ...
- win10子系统linux下cmake编译32位程序
文章目录 Ubuntu 18运行32位程序 添加软件源 安装编译环境 编写CMakeLists.txt cmake编译 运行程序 SUSE 15.0运行32位程序 m32编译 添加软件源 安装qemu ...
最新文章
- 一键cosplay各路动漫人物!快手的这个BlendGAN火了 | NeurIPS 2021
- 经过五年测试 维基利用HTML5迈入视频时代
- curl获取网页内容出现乱码或为空的解决方案,另附curl_getinfo函数解析
- asp.net2.0导出pdf文件完美解决方案(转载)
- 代码演示:先来后到的特例、优劣、源码分析
- STM32上使用JSON
- python库路径_如何设置本地python库目录/ PYTHONPATH?
- spring集成quartz框架
- 《Go语言实战》读书笔记——关于Go语言的介绍
- 【前端第七课】媒体查询的语法;移动端适配相关知识点;Grid高级布局
- cat << EOF 什么意思?
- 二叉树线索化(C语言)
- 磁盘存储链式的B树与B+树
- Qt在线安装器下载快的办法
- 书论91 万经《分隶偶存》
- EtherCat主站与从站简介
- 如何一次性删除PPT中所有动画效果?
- python 全自动化爬取必应图片
- javascript超空间(removeChild和innerHTML区别)
- 使用帕累托最优选择解释涌现现象
热门文章
- android 全景拼接软件,这款全景图片拼接软件很强大
- 获取上一个自然周的、上一个自然月的起始时间范围
- 使用计算机时按什么键打开,计算机进入BIOS的快捷键是什么|打开计算机以进入BIOS设置时按下的键...
- 看懂需要勇气,33张人性图!
- [转]Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
- 基于TCGA及SEER等癌症公共数据库的深度挖掘和科研设计会议
- 黄油刀的配置与使用——个人学习记录
- Unity3D模型 | SolidWorks建模导入Unity
- 精益看板方法从理论到实战 (5)—— 控制在制品数量(上)
- ACM javaIO 快速 读写