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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值