`
microjava
  • 浏览: 318799 次
  • 性别: 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 学习 笔记GCC学习笔记

    ### GCC 学习笔记知识点详解 #### 一、GCC简介与版本检查 - **GCC**(GNU Compiler Collection)是一款开源的编译器集合,广泛应用于Linux等类Unix系统上,支持多种编程语言如C、C++等。 - **版本检查**: - 要...

    gcc源码总结

    gcc源码总结 gcc源代码的总结主要包括语法树的操作和对程序的解析。以下是gcc源码总结的相关...GCC编译器的缺点包括复杂的使用方式、缓慢的编译速度、有限的语言支持等。GCC编译器的缺点限制了其在某些领域的应用。

    linux学习笔记.pdf

    本文档主要记录了 Linux 操作系统的学习笔记,涵盖了 Basic 的编程、VI 编辑器的使用、GCC 编译器的应用、GDB 调试工具的使用等方面的知识点。 一、编程基础 * 了解 C 语言的基本语法,例如变量声明、数据类型、...

    gcc工具链的选项笔记

    gcc工具链的选项笔记 gcc工具链的选项笔记是对GCC编译器的选项进行的详细记录和说明。...gcc工具链的选项笔记为开发者提供了 GCC 编译器的详细使用说明,帮助开发者更好地使用GCC编译器,并提高编译效率和质量。

    winavr及gcc教程

    标题“winavr及gcc教程”指的是针对AVR微控制器的编程环境WinAVR和GCC编译器的学习资源。WinAVR是一个包含AVR-GCC的套件,提供了在Windows环境下开发AVR微控制器程序的工具链。GCC(GNU Compiler Collection)是一个...

    C高级学习笔记.doc

    C高级学习笔记 本笔记涵盖了C语言高级知识点,包括gcc编译器、编译常见错误与调试、指针、结构体、共用体、枚举类型、内存的动态分配、makefile工程管理器等。 一、gcc编译器 gcc编译器是C语言编译器的代表,它将...

    微机系统实验一学习笔记(个人监督)

    ### 微机系统实验一学习笔记(个人监督) #### 实验背景 本次实验旨在通过实践操作,使学生能够深入理解微机系统的环境搭建与基本应用。南京中医药大学人工智能与信息技术学院的学生聂乾枫在其微机系统实验报告中...

    嵌入式Qt移植前期准备-思维导图-学习笔记-基于正点原子阿尔法开发板

    Qt移植是为了在自制系统或资源受限的嵌入式系统上运行Qt应用...下载并解压Linaro GCC编译器到Ubuntu系统的指定目录,修改环境变量并重启系统即可完成交叉编译器的安装和验证。根文件系统的准备对于驱动开发也同样重要。

    AVR学习笔记

    AVR学习笔记是一系列关于微...同时,了解avr-gcc编译器、AVR Studio或其他IDE的使用,以及如何烧录固件到微控制器也是必要的。随着深入学习,你将能够设计和实现自己的AVR项目,从简单的LED闪烁到复杂的嵌入式系统。

    c++学习笔记精华版

    ### C++ 学习笔记精华版 #### 一、C++ 语言概述 **1、历史背景** - **C++ 的江湖地位** - Java、C、C++、Python、C# 是当前主流的编程语言之一,而 C++ 在这些语言中以其高效性和灵活性著称。 - **C++ 之父 ...

    林夕依然ICCAVRGCCAVR学习笔记(源码+proteus7.5仿真)

    这份学习笔记很可能包含了关于AVR微控制器的基础知识,如寄存器配置、中断处理、定时器/计数器的使用、串行通信、I/O端口操作等内容。同时,也会涉及如何使用ICC AVR和GCC AVR进行编程,包括编译环境的搭建、代码...

    linux的学习笔记

    #### GCC 编译器的使用 1. **GCC 版本检查:** - 使用 `gcc -v` 命令可以显示当前系统的 GCC 版本信息。 2. **编译单个文件:** - 在命令行中使用 `gcc -c &lt;源文件名&gt;.c -o &lt;目标文件名&gt;.o` 可以将 C 源文件编译...

    c语言学习笔记(不完全)

    【C语言学习笔记概述】 C语言是一种强大的编程语言,由Dennis Ritchie和Ken Thompson在1972年为了编写UNIX操作系统而设计。它是B语言的进化版本,而B语言又源自BCPL。C语言以其高效、灵活性和对底层硬件的直接访问...

    新手C学习笔记(仅供菜鸟成长参考).rar

    笔记会讲解如何利用printf进行简单的错误检测,使用gcc编译器的调试选项-g,以及使用gdb进行程序调试。 八、实践项目 理论知识的学习需要通过实践来巩固。笔记可能会提供一些简单的编程练习,如实现计算器、链表...

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

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

    嵌入式开发学习笔记

    作者希望能够通过分享自己的学习笔记,帮助其他初学者少走弯路。 综上所述,本文档为嵌入式开发的初学者提供了一份详细的学习指南,不仅覆盖了嵌入式开发的基础知识,还包括了实际操作中可能遇到的问题和解决方案,...

    gcc.rar_gcc

    **GCC配置笔记** GCC(GNU Compiler Collection)是GNU项目的核心组件,它是一个开源的、跨平台的编译器集合,支持C、C++、Objective-C、Fortran、Ada、Go等多种编程语言。这个“gcc.rar_gcc”压缩包很可能是包含了...

    朱伟光的gcc.rar

    【标题】:“朱伟光的gcc.rar”是一个与GCC(GNU Compiler Collection)相关的资源压缩包,可能包含了朱伟光先生关于GCC编译器的讲解、教程或者代码示例。 【描述】:描述中的“朱伟光的gcc.rar”并未提供具体的...

Global site tag (gtag.js) - Google Analytics