gcc -fomit-frame-pointer选项,-fno-dwarf2-cfi-asm 选项
碰到或者找到了这两个选项,研究了一下,如下:
gcc 选项 -fomit-frame-pointer 省略框架指针
----------------------------------------
1. 测试程序
----------------------------------------
$ cat hello.c
#include <stdio.h>
void hi(void)
{
printf("hello\n");
}
int main(int argc, char *argv[])
{
hi();
return 0;
}
c 调用框架:
pushl %ebp;
movl %ebp,%esp
...
pop %rbp
ret
是框架
----------------------------------------
2. gcc -o hello hello.c
----------------------------------------
有框架,有堆栈操作。
000000000040052d <hi>:
40052d: 55 push %rbp
40052e: 48 89 e5 mov %rsp,%rbp
400531: bf e4 05 40 00 mov $0x4005e4,%edi
400536: e8 d5 fe ff ff callq 400410 <puts@plt>
40053b: 5d pop %rbp
40053c: c3 retq
----------------------------------------
3. gcc -fomit-frame-pointer -o hello hello.c
----------------------------------------
省略了框架
000000000040052d <hi>:
40052d: 48 83 ec 08 sub $0x8,%rsp
400531: bf e4 05 40 00 mov $0x4005e4,%edi
400536: e8 d5 fe ff ff callq 400410 <puts@plt>
40053b: 48 83 c4 08 add $0x8,%rsp
40053f: c3 retq
----------------------------------------
4. gcc -fomit-frame-pointer -O2 -o hello hello.c
加 -O2 优化
----------------------------------------
该函数中没有看到使用堆栈
0000000000400540 <hi>:
400540: bf d4 05 40 00 mov $0x4005d4,%edi
400545: e9 c6 fe ff ff jmpq 400410 <puts@plt>
40054a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)
--------------------------------------------------------------------------------
-fno-dwarf2-cfi-asm 选项
--------------------------------------------------------------------------------
gcc -march=i386 -m32 -fno-dwarf2-cfi-asm -fno-builtin -c -o string.o string.c -Wa,-alh=string.lst
加入 -fno-dwarf2-cfi-asm 将使.cfi 指令明显减少,如下为有和没有此选项的对比
CFA: 标准帧地址,调用其他函数时的堆栈指针地址
cfi_def_cfa_offset: 栈地址的改变用这个标识符表示。
memset:
1035 .LFB18:
395:string.h ****
396:string.h **** inline void * memset(void * s,char c,int count)
397:string.h **** {
1036 .loc 1 397 0
1037 .cfi_startproc
1038 03ec 55 pushl %ebp
1039 .cfi_def_cfa_offset 8
1040 .cfi_offset 5, -8
1041 03ed 89E5 movl %esp, %ebp
1042 .cfi_def_cfa_register 5
1043 03ef 57 pushl %edi
1044 03f0 83EC04 subl $4, %esp
1045 .cfi_offset 7, -12
1046 03f3 8B450C movl 12(%ebp), %eax
1047 03f6 8845F8 movb %al, -8(%ebp)
398:string.h **** __asm__("cld\n\t"
1048 .loc 1 398 0
1049 03f9 8A45F8 movb -8(%ebp), %al
1050 03fc 8B5508 movl 8(%ebp), %edx
1051 03ff 8B4D10 movl 16(%ebp), %ecx
1052 0402 89D7 movl %edx, %edi
1053 #APP
1054 # 398 "string.h" 1
399 0405 F3 "rep\n\t"
400 0406 AA "stosb"
401 ::"a" (c),"D" (s),"c" (count)
402:string.h **** );
403:string.h **** return s;
1055 cld
1056 rep
1057 stosb
1058 # 0 "" 2
1059 .loc 1 403 0
1060 #NO_APP
1061 0407 8B4508 movl 8(%ebp), %eax
404:string.h **** }
1062 .loc 1 404 0
1063 040a 83C404 addl $4, %esp
1064 040d 5F popl %edi
1065 .cfi_restore 7
1066 040e 5D popl %ebp
1067 .cfi_restore 5
1068 .cfi_def_cfa 4, 4
1069 040f C3 ret
1070 .cfi_endproc
1071 .LFE18:
1072 .size memset, .-memset
--------------------------------------------------------------------------------
937 memset:
938 .LFB18:
395:string.h ****
396:string.h **** inline void * memset(void * s,char c,int count)
397:string.h **** {
939 .loc 1 397 0
940 03ec 55 pushl %ebp
941 .LCFI115:
942 03ed 89E5 movl %esp, %ebp
943 .LCFI116:
944 03ef 57 pushl %edi
945 03f0 83EC04 subl $4, %esp
946 .LCFI117:
947 03f3 8B450C movl 12(%ebp), %eax
948 03f6 8845F8 movb %al, -8(%ebp)
398:string.h **** __asm__("cld\n\t"
949 .loc 1 398 0
950 03f9 8A45F8 movb -8(%ebp), %al
951 03fc 8B5508 movl 8(%ebp), %edx
952 03ff 8B4D10 movl 16(%ebp), %ecx
953 0402 89D7 movl %edx, %edi
954 #APP
955 # 398 "string.h" 1
399 0405 F3 "rep\n\t"
400 0406 AA "stosb"
401 ::"a" (c),"D" (s),"c" (count)
402:string.h **** );
403:string.h **** return s;
956 cld
957 rep
958 stosb
959 # 0 "" 2
960 .loc 1 403 0
961 #NO_APP
962 0407 8B4508 movl 8(%ebp), %eax
404:string.h **** }
963 .loc 1 404 0
964 040a 83C404 addl $4, %esp
965 040d 5F popl %edi
966 .LCFI118:
967 040e 5D popl %ebp
968 .LCFI119:
969 040f C3 ret
970 .LFE18:
971 .size memset, .-memset
看完此代码,可以感到:
1. C 框架比直接用汇编效率差不少,(受框架限制)
2. 优化对C语言有什么含义? 不优化,有的代码倒來倒去没有意义。
优化使代码在汇编级更简略,但可能对gdb调试不利,跳来跳去
gcc -fomit-frame-pointer选项,-fno-dwarf2-cfi-asm 选项相关推荐
- 框架指针省略(Frame Pointer Omission)(FPO)
框架指针省略(Frame Pointer Omission)(FPO) FPO是一种优化,它压缩或者省略了在栈上为该函数创建框架指针的过程.这个选项加速了函数调用,因为不需要建立和移除框架指针(ESP ...
- mysql启动选项只读_MySQL的启动选项和系统变量该如何配置?
MySQL的配置信息可以通过两种方式实现,一种是命令行形式,在启动MySQL服务时后边带上相关配置参数,此种方式会在MySQL重启后失效.另外一种是通过写入配置文件,如my.cnf,启动或者重启MyS ...
- 在Ajax方式产生的浮动框中,点击选项包含某个关键字的选项
#!usr/bin/env python #-*- coding:utf-8 -*- """ @author: sleeping_cat @Contact : zwy24 ...
- 如何删除选择框的所有选项,然后添加一个选项并使用jQuery选择它?
本文翻译自:How do you remove all the options of a select box and then add one option and select it with j ...
- android 5.1 壁纸路径,Android5.1 壁纸来源选项中有两个“壁纸”选项
Android5.1 壁纸来源选项中有两个"壁纸"选项 [问题] 系统语言为中文,打开 设置->显示->壁纸->查看显示 可以看到设置菜单中有两个壁纸选项显示 系 ...
- 【电脑问题解决】回收站右键,多出来个“找回清空的文件”选项,怎么删除这个选项?
回收站右键,多出来个"找回清空的文件"选项,怎么删除这个选项? 解决方案: 第一步:在桌面新建记事本 第二步:复制粘贴如下代码: Windows Registry Editor V ...
- win7计算机文件夹选项在哪里,文件夹选项在哪里(Win7、Windows 2008 R2)
在文件夹选项中,可以对文件夹及文件进行相关设置(诸显示.隐藏文件和文件夹,文件扩展名等).从未进行过这方面设置的用户,可能不知道文件夹选项在哪里:不知道也没关系,现在就介绍三种打开文件夹选项的方法. ...
- [经验教程]Windows电脑桌面右键菜单的多余选项怎么删除清理右键选项?
随着Windows电脑下载安装应用软件越来越多,一些软件会在Windows电脑右键增加一些无用多余的选项,而较多的右键选项会造成使用上不必要的麻烦.如何删除清理多余无用的选项成为每个人都需要了解的方法 ...
- json格式的数据集中每一条数据5个选项随机去掉一个错误选项,剩余选项重新排序
json文件中每一条数据5个选项随机去掉一个错误选项,剩余选项重新排序 json格式的数据集中含有5个选项,随机去掉一个错误选项,剩余选项重新排序. 数据集示例: [{"context&qu ...
- Win10计算机组织选项在哪里,文件夹选项在哪里,教您Win10文件夹选项在哪
Win10系统发布以来,就有很多用户都开始纷纷选择升级安装,而win10系统在界面和功能上跟以往的Windows系统有了很大的不同,很多同学找不到以前熟悉的设置选项,比如文件夹选项,下面,小编就来跟大 ...
最新文章
- CSS之 :before :after的用法,伪类和伪元素的区别
- NYOJ 30 Gone Fishing(贪心)
- 平面内两条线段的位置关系(相交)判定与交点求解
- java对hashmap迭代_Java:通过HashMap迭代,这样更有效率?
- servlet中实现页面跳转return “r:”和return “f:
- 数据库建立索引的优缺点及适合建立索引的字段
- python给批量图片添加文字_Python之利用PIL批量给图片添加文字
- 2021年程序员个人年终工作总结10篇
- 机器人操作臂运动学入门一--D-H参数标定
- 无人机生成地图_无人机配方向传感器可自行创建地图+规划路线
- 腾讯云短信发送php
- 学学Gnuplot(常用命令及参数)
- 驱动专题:第四章MTD及Flash驱动 3. nandflash 详细硬件特性
- .NET 经常被面试官问到的问题
- 译《Office商业应用程序入门》
- 多传感器数据融合学习笔记
- 1 error LNK2019: 无法解析的外部符号 _Direct3DCreate9@4,该符号在函数 void __cdecl InitD3D(struct HWND__ *)
- hadoop文件存储位置_hadoop文件存储目录
- 北京防灾科技学院计算机怎么样,防灾科技学院
- 遭遇使用映像劫持/IFEO 的 Worm.Win32.Avkiller.i/gavuusg.exe /v2