`
microjava
  • 浏览: 308475 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

GCC编译器使用学习笔记(三)

阅读更多
GCC编译器使用学习笔记(三)

gcc debug

gcc -g

cat -n null.c // -n 列出行号

int a(int *p);

int main(void)
{
  int* p = 0; //0是内核地址
  return a(p);
}

int a(int *p)
{
  int y = *p; //访问内核地址,不允许
  return y;
}


--进行debug

gcc -Wall -g null.c
//编译语法没有错误

./a.out

ulimit -c

ulimit -c unlimited  //允许产生core dumped

man ulimit

./a.out

ll

gdb a.out core.6363

//查看详细信息
print p

backtrace

cat -n null.c

--优化
debug,不优化
-o0

生产:
-o2

vi test.c
#include<stdio.h>
double powern(double d,unsigned n)
{
  double x = 1.0;
  unsigned j = 1;
  for(;j<=n;j++)
  {
    x *= d;
  }
  return x;
}

int main(void)
{
  double sum = 0.0;
  unsigned i=1;
  for(;i<=100000000;i++)
  {
    sum += powern(i,i%5);
  }
  printf("sum = %g.\n",sum);
  return 0;
}


不优化
gcc -Wall -o0 test.c -o test
time ./test     //查看指向时间

o1优化
gcc -Wall -o1 test.c -o test01
time ./test01     //查看指向时间

o2优化
gcc -Wall -o2 test.c -o test02

time ./test02     //查看指向时间

o3优化
gcc -Wall -o3 test.c -o test03
time ./test03     //查看指向时间

对循环进行优化
gcc -Wall -o3 -funroll-loops test.c -o test04
time ./test04     //查看指向时间

vi uninit.c
int sign(int x)
{
  int s;

  if(x>0)
    s = 1;
  else if(x<0)
    s = -1;

  return s;
}

//s没有初始化,存在漏洞,-o1 才可以检查出来

gcc -Wall -o1 -c uninit.c

--经典优化
for(i=0;i<n;i++)
{
  y[i]=i;
}


优化后:
for(i=0;i<(n%2);i++)
{
  y[i]=i;
}

for(;i+1<n;i+=2)
{
  y[i] = i;
  y[i+1] = i+1;
}

减少循环判断次数


--编译c++
g++
which g++:g++编译c++
which gcc: gcc编译c

vi hello.cc

#include<iostream>
int main()
{
  std::cout<<"Hello,world!"<<std::endl;
  return 0;
}

g++ -Wall hello.c -o hello

//只编译
g++ -Wall -c hello.cc
//连接
g++ hello.o -o hello

--编译器是怎么工作的?
四个步骤:
1.预处理
2.编译
3.汇编
4.链接

vi hello.c
#include<stdio.h>
int main(void)
{
  printf("Hello,world!\n");
  return 0;
}



gcc -Wall hello.c -o hello
分解步骤:

1.预处理
cpp hello.c > hello.i

cat hello.i | more

2.编译成汇编语言
gcc -Wall -S hello.i
cat hello.s

3.汇编产生目标文件
as hello.s -o hello.o

4.链接
gcc hello.o -o hello


--gcc辅助工具
1. file
file hello
file hello.c

ELF:可执行文件
LSB:编译平台

2.ldd:查看依赖的动态库

--gcc优化工具
1.gprof:查看每个函数的执行时间和调用次数

gcc -Wall -pg hello.c -o hello
gprof hello

2.gcov:统计程序每行的执行时间
vi cov.c

#include<stdio.h>
int main(void)
{
  int i;
  for(i=1;i<10;i++)
  {
    if(i%3 == 0)
         printf("%d is divisible by 3.\n",i);
    if(i%11 == 0)
         printf("%d is divisible by 11.\n",i);
  }
}


gcc -Wall -fprofile-arcs -ftest-coverage cov.c -o cov
./cov
gcov cov.c

grep "#####" *.gcov




分享到:
评论

相关推荐

    gcc编译器的使用笔记

    在学习linux过程中,对gcc编译器的使用选项的一些摘录,希望对大家的学习有帮助!

    gcc学习材料

    gcc学习笔记,非常好的东西哦,关于ssa数的,编译器相关的

    【韦东山Linux学习】学习笔记(汇总版)

    系统gcc编译器默认头文件路径:一般在/usr/include目录下,进入该目录,然后使用find -name stdio.h表示在当前目录下查找stdio.h头文件! == find /usr/include/ -name stdio.h 交叉编译gcc编译器默认头文件路径:...

    韩顺平教学Linux笔记

    Linux学习笔记。详述了Linux命令,gcc编译器

    《TCP/IP网络编程》学习笔记

    本资源是介绍《TCP/IP网络编程》学习笔记及具体代码实现,代码部分请参考章节文件夹下的代码,readme中有详细的说明。 环境是:Ubuntu18.04 LTS 编译器版本:g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 和 gcc ...

    Linux 运维 入门到高级

    Linux启动流程 Linux根据端口号查看被占用的服务 升级gcc编译器 自动化运维 安装kickstart文件(半自动化) ANSIBLE部署 企业级OpenVPN 安装OpenVPN 该笔记由刘森飚整理,版权归原作者所有 仅用于学习交流分享,如有...

    ISL:用于使用 Graphite 循环优化构建 GCC 的 GNU ISL 库

    编译器:gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) 编译步骤 版本:0.11.1 (符合 GMP-4.3.2) wget ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.11.1.tar.bz2 tar xvf isl-0.11.1.tar.

    全志H5(Nanopi_Neo_Plus2)学习笔记

    1.1 搭建交叉编译器 1.2 Menuconfig 中选择 y 和 m 的区别 1.3 分析 uboot 启动流程 1.4 更新 linu 下 gcc 版本 1.5 配置 WiFi 无线热点 1.6 制作根文件系统 1.7 Linux 下(SD 卡) 磁盘分区,格式化,挂载 2.1 ...

    百度地图毕业设计源码-TCP-IP-NetworkNote::blue_book:《TCP/IP网络编程》(韩-尹圣雨)学习笔记

    《TCP/IP网络编程》学习笔记 :carp_streamer: 此仓库是我的《TCP/IP网络编程》学习笔记及具体代码实现,代码部分请参考本仓库对应章节文件夹下的代码。如果本笔记的内容对你有用,请点击一个 star ,转载请注明出处...

    netmon_cli:一个简单轻量级的终端数据包嗅探器

    netmon_cli 一个用 C 编写的简单、轻量级的终端数据包嗅探器。 免责声明 此工具仅为教育目的而构建,对于因非法使用...gcc 编译器 根权限 制作 笔记 我使用了特殊字符来显示颜色,它们在某些终端仿真器中可能不起作用

    安装WRF模式3.8.1

    #WRF模式安装网上有很多分享文章,我参考《兰溪之水WRF模式入门指南》和《WRFlinux学习笔记——从零开始》两篇文章,加入自己在安装过程中遇到问题解决问题的小小经验或者是心得体会,整理分享出来,希望帮助到有...

    word源码java-CTF:2018年2月15日至28日的CTF、C++STL等内容学习笔记

    VSCode是一个代码编译器,支持多种语言,编译运行单一文件不是很方便,可以通过插件Launcher开启CMD窗口,调用第三方程序执行一些命令,这里借用这个插件实现调用WSL编译运行单个文件 1.Windows调用WSL运行Linux程序...

    C与C++程序设计学习与实验系统 .zip

    现在已全面支持最新操作系统VISTA,它是从事一线教学的大学教师根据C/C++ 初学者的特点,量身定制的一个简单易用的 C/C++程序设计学习与实验软件(支持TC2/TC3、GCC、VC6四种编译器,没有使用日期限制)。与软件配套的...

    C/C++程序设计学习与实验系统 2010.part1

    C/C++程序设计学习与实验软件(支持TC2/TC3、GCC、VC6四种编译器,没有使用日期限制)。与软件配套的《 C/C++程序设计教程(配有同步实验、流程控制语句动画演示、提供教程中所有程序实例、实验、作业中的源代码(全部...

    c++与c程序设计学习与实验系统(2014)

    它是从事一线教学的大学教师根据多媒体教学演示和C语言初学者的特点,量身打造的一个简单易用的C/C++程序设计教学演示、学习与实验软件(支持TC2/TC3、VC6、GCC四种编译器,单步调试功能免费,没有使用日期限制)。...

    C/C++程序设计学习与实验系统 2010.part2

    C/C++程序设计学习与实验软件(支持TC2/TC3、GCC、VC6四种编译器,没有使用日期限制)。与软件配套的《 C/C++程序设计教程(配有同步实验、流程控制语句动画演示、提供教程中所有程序实例、实验、作业中的源代码(全部...

    C/C++程序设计学习与实验系统 2010.part3

    C/C++程序设计学习与实验软件(支持TC2/TC3、GCC、VC6四种编译器,没有使用日期限制)。与软件配套的《 C/C++程序设计教程(配有同步实验、流程控制语句动画演示、提供教程中所有程序实例、实验、作业中的源代码(全部...

    C与C++程序设计学习与实验系统 2011.2

    现在已支持最新操作系统WINDOWS 7,它是从事一线教学的大学教师根据C程序多媒体教学演示和C语言初学者的特点,量身打造的一个简单易用的C/C++程序设计教学演示、学习与实验软件(支持TC2/TC3、GCC、VC6四种编译器,...

    C/C++程序设计学习与实验系统

    它是从事一线教学的大学教师根据C程序多媒体教学演示和C语言初学者的特点,量身打造的一个简单易用的C/C++程序设计教学演示、学习与实验软件(支持TC2/TC3、GCC、VC6四种编译器,没有使用日期限制)。与软件配套的《 ...

    ARM 嵌入式LINUX 系统构建与驱动开发

    我的答案是“在你个人的学习方*”,但是如果看家是需要看这骗笔记的水平,个人推荐还是买现成的。 1 买 买板子可以把注意力集中在软件开发上,软件开发(尤其是驱动)可以不必担心自己硬件上的问题,我就是以便调试...

Global site tag (gtag.js) - Google Analytics