GCC编译器使用学习笔记(三)
gcc debug
gcc -g
cat -n null.c // -n 列出行号
--进行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
不优化
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
//s没有初始化,存在漏洞,-o1 才可以检查出来
gcc -Wall -o1 -c uninit.c
--经典优化
优化后:
减少循环判断次数
--编译c++
g++
which g++:g++编译c++
which gcc: gcc编译c
vi hello.cc
g++ -Wall hello.c -o hello
//只编译
g++ -Wall -c hello.cc
//连接
g++ hello.o -o hello
--编译器是怎么工作的?
四个步骤:
1.预处理
2.编译
3.汇编
4.链接
vi hello.c
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
gcc -Wall -fprofile-arcs -ftest-coverage cov.c -o cov
./cov
gcov cov.c
grep "#####" *.gcov
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