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




猜你喜欢

转载自microjava.iteye.com/blog/547293