解析elf文件结构html
ex:gcc -c main.c 输出main.o文件,.o文件不可执行
![]()
ex:gcc -o main main.o 将main.o连接为可执行文件,输出main
![]()
-g 若是想用调试器执行一个可执行文件, 在用gcc编译时必须加上-g选项,加上-g选项之后,gcc在编译时会作如下额外的操做:linux
注意上面的说明中红框标注的内容,若是-l:filename
格式指定一个文件名,链接程序直接去找这个文件名了,不会再像使用-lname
时将name扩展成lib<name>.a
格式的文件名.
因此使用-l:libpng.a
这样的形式来指定链接库,就指定了静态链接png
库。
固然若是库的位置不在gcc默认搜索路径中,要用-L
参数另外指定搜索库的路径,不然链接程序不知道该从哪里找到filename
。
gcc -shared -fPIC -o test.so test.c LD_PRELOAD=./test.so /usr/bin/target
https://www.jianshu.com/p/3a2...
gcc 4.8以上支持addressSanitizer,其能检测的错误类型
用-fsanitize=address选项编译和连接你的程序;
用-fno-omit-frame-pointer编译,以在错误消息中添加更好的堆栈跟踪。
增长-O1以得到更好的性能(最基础的优化,分为1,2,3级)shell
简单源码示例:数组
#include <stdlib.h> char leaktest(){ char* x =(char*)malloc(10*sizeof(char*)); return x[5]; } int main(){ leaktest(); return 0; }
编译:gcc -fsanitize=address -fno-omit-frame-pointer -O1 -g leaktest.c -o leaktest
架构
一、 默认状况下,make 会以第一条规则做为其“终极目标”。
二、make在执行命令时会检测依赖文件的时间戳:
若依赖文件不存在或者依赖文件的时间戳比目标文件新,则执行依赖文件对应的命令。
若依赖文件的时间戳比目标文件老,则忽略依赖文件对应的命令。
三、make
目标文件的依赖文件是按照从左到右的顺序生成的
一、makefile文件基本书写规则函数
TARGET... : PREREQUISITES...
COMMAND
TARGET:规则目标,能够为文件名或动做名
PREREQUISITES:规则依赖
COMMAND:命令行,必须以[TAB]开始,由shell执行工具
ex:post
1 #this is a makefile example 2 3 main:main.o 4 gcc -o main main.o 5 6 main.o:main.c 7 gcc -c main.c
使用:性能
二、变量使用优化
${变量名}
$(变量名)
$单字符变量名
,Makefile有三个很是有用的变量。分别是$@
(目标文件),$^
(全部的依赖文件),$<
(第一个依赖文件)
参考: https://www.cnblogs.com/baidu...
ex:
# 变量定义 objects = program.o foo.o utils.o program : $(objects) #在依赖中引用变量 gcc -o program ${objects} #在命令中引用变量 $(objects) : defs.h #在目标中引用变量
三、变量的分类和赋值
根据变量定义时所使用的赋值操做符的不一样,能够将变量分红两种类型(或者说是两种风格):
递归展开式变量
和直接展开式变量
;
使用赋值操做符=
、+=
和?=
定义的变量都是 递归展开式变量,使用赋值操做符:=
定义的变量为 直接展开式变量 。两种变量类型的的最根本区别在于:变量值的求值时机,递归式变量的求值时机在于变量被引用时,直接展开式的求值时机在于变量被定义时。
四、makefile选项
五、make参数
一、make -j4 用4核同时编译,默认1核,能够不用加这个...
二、make -n/--just-print/--dry-run/--recon 只检查Makefile的命令,输出组合后的结果,不执行
你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不一样的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:若是软件想跨平台,必需要保证可以在不一样平台编译。而若是使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工做。
CMake就是针对上面问题所设计的工具:它首先容许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,而后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而作到“Write once, run everywhere”。显然,CMake 是一个比上述几种 make 更高级的编译配置工具。一些使用 CMake 做为项目架构系统的知名开源项目有 VTK、ITK、KDE、OpenCV、OSG 等 [[1]](https://www.hahack.com/codes/...。
在 linux 平台下使用 CMake 生成 Makefile 并编译的流程以下:
cmake PATH
或者 ccmake PATH
生成 Makefile ,ccmake
和 cmake
的区别在于前者提供了一个交互式的界面。。其中, PATH
是 CMakeLists.txt 所在的目录。make
命令进行编译。mkdir bld
cd bld
cmake .. (CMakeLists.txt在上一级目录)
make
clang使用libfuzzer进行fuzz所需参数
-fsanitize-coverage=trace-pc-guard(编译器在每条边界插入代码,每条边界的guard都不一样。), trace-cmp(编译器将在比较指令和switch语句周围插入额外的工具),trace-gep(LLVM GEP指令(捕获数组索引)),trace-div(编译器将检测整型除法指令(以捕获除法的正确参数))