gcc

gcc命令行参数

-E        #预处理,可以重定向到文件或者指定-o
-S        #预处理和编译生成 .s 文件
-c        #预处理、编译、汇编成目标代码(机器语言)

-o        #指定目标文件的名称

#gcc 在编译时会有 .s 汇编文件 .o 目录文件等,实际上gcc将中间文件放在了 /tmp 目录下
#加上此选项,可以利用管道技术来代替临时文件,从而提高编译效率(在非 gnu 汇编工具可能会出现问题)
-pipe

-v  #显示详细编译信息
--version  #打印版本号

-ansi    #同-std=c89
-std=    #c89 c99 c11 c++98 c++11
-funsigned-char   #char 默认为 unsigned char

@file   #把该文件里面的内容读取出来当做参数

-N    数据段编译进代码段

错误警告参数

-fsyntax-only    #只校验语法
-w        #禁止所有警告
-Werror   #所有警告当成错误
-Werror=  #把特定的警告当成错误
-Wfatal-errors   #遇到一个错误立马停止

-Wall     #开启所有警告
-Wextra   #开启额外警告

#使用标准iso c编译,不能使用扩展
-Wpedantic
-pedantic

调试优化

-O0
-O1
-O2
-O3

-g3

预处理器参数

-Wp,option 多个option使用逗号隔开

-E 只预处理
-D name
-D name=definition

-U name    #取消定义
-undef     #取消定义系统或者gcc定义的宏
-I dir     #指定搜索路径
-o file    #指定输出文件

-include file  #包含头文件到第一行

汇编器参数

-Wp,option 多个option使用逗号隔开

链接器参数

-Wl,option 多个option使用逗号隔开

-llibrary
-l library

-nostdlib  #不使用标准系统文件和库
-pie       #位置无关可执行
-rdynamic  #所有符号增加到动态符号表,不只是使用到的
-s         #从可执行文件移除所有符号表和重定位信息

-static    #使用静态链接
-shared    #使用动态链接

-shared-libgcc
-static-libgcc

-T script  #指定链接脚本

-Wl,option  #指定链接器参数,多个参数使用逗号隔开
#-Wl,-Map,output.map 同 ld -Map output.map

路径搜索

-Idir    #头文件搜索路径
-Ldir    #库搜索路径

--sysroot=dir  #指定根路径,默认为/

代码生成

-fpic
-fPIC

#一般被gcc -pie 来链接
-fpie
-fPIE

#如果不指定值,那么结构体变量之间不会有空洞
-fpack-struct[=n]

#符号默认是否隐藏,默认是不隐藏
#-fvisibility=hidden 结合 __attribute__ ((visibility("default")))
-fvisibility=default|hidden

影响gcc的环境变量

LIBRARY_PATH    #链接搜索路径,冒号隔开

gcc扩展

声明

({xxx;xxx;return;}),最后一个语句可以当做返回值

({ int y = foo (); int z;
if (y > 0) z = y;
else z = - y;
z; })
#define maxint(a,b) \
({int _a = (a), _b = (b); _a > _b ? _a : _b; })

本地标签

__label__,一般用于goto,正常标签作用域是整个函数,如果一个宏定义包含一个标签,就不能重复出现在一个函数内

而本地标签则不会

#define SEARCH(value) \
do {                  \
__label__ found;      \
(value) = -1;         \
goto found;           \
found:;               \
} while (0)
#define SEARCH() \
({                  \
__label__ found;      \
goto found;           \
found:               \
value;               \
})

typeof

#define max(a,b) \
({ typeof (a) _a = (a); \
typeof (b) _b = (b); \
_a > _b ? _a : _b; })

长度为0的数组

struct line {
    int length;
    char contents[0];
};

宏定义可变参数

#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)

#define debug(format, args...) fprintf (stderr, format, args)

函数属性

__attribute__ ((attribute-list)) 这是一般格式

alias ("target")      #别名
aligned (alignment)   #字节对齐
always_inline         #不管代码有没优化,函数都inline

#指定在执行main函数之前或者之后执行
#如果有多个可以指定数字,越小越早执行
constructor
destructor
constructor (priority)
destructor (priority)

#指明废弃,如果在某处被调用,则警告
deprecated
deprecated (msg)

noreturn  #函数不返回

#自己指定section
section ("section-name")

#标记函数未被使用,编译不会警告
unused

#标记符号可见性,一般为hidden和default
visibility ("visibility_type")

#标记弱符号
weak

weakref
weakref ("target")

变量属性

int x __attribute__ ((aligned (16))) = 0;

deprecated
deprecated (msg)

used
unused
packed
weak

gcc内置

__LINE__
__FUNCTION__
__FILE__

__ATOMIC_RELAXED
__ATOMIC_CONSUME
__ATOMIC_ACQUIRE
__ATOMIC_RELEASE
__ATOMIC_ACQ_REL
__ATOMIC_SEQ_CST

type __atomic_load_n (type *ptr, int memmodel)
void __atomic_load (type *ptr, type *ret, int memmodel)
void __atomic_store_n (type *ptr, type val, int memmodel)
void __atomic_store (type *ptr, type *val, int memmodel)
type __atomic_exchange_n (type *ptr, type val, int memmodel)
void __atomic_exchange (type *ptr, type *val, type *ret, int memmodel)

bool __atomic_compare_exchange_n (type *ptr, type
*expected, type desired, bool weak, int success_memmodel, int
failure_memmodel)

bool __atomic_compare_exchange (type *ptr, type
*expected, type *desired, bool weak, int success_memmodel, int
failure_memmodel)

type __atomic_add_fetch (type *ptr, type val, int memmodel)
type __atomic_sub_fetch (type *ptr, type val, int memmodel)
type __atomic_and_fetch (type *ptr, type val, int memmodel)
type __atomic_xor_fetch (type *ptr, type val, int memmodel)
type __atomic_or_fetch (type *ptr, type val, int memmodel)
type __atomic_nand_fetch (type *ptr, type val, int memmodel)
type __atomic_fetch_add (type *ptr, type val, int memmodel)
type __atomic_fetch_sub (type *ptr, type val, int memmodel)
type __atomic_fetch_and (type *ptr, type val, int memmodel)
type __atomic_fetch_xor (type *ptr, type val, int memmodel)

type __atomic_fetch_or (type *ptr, type val, int memmodel)
type __atomic_fetch_nand (type *ptr, type val, int memmodel)
bool __atomic_test_and_set (void *ptr, int memmodel)
void __atomic_clear (bool *ptr, int memmodel)
void __atomic_thread_fence (int memmodel)
void __atomic_signal_fence (int memmodel)
bool __atomic_always_lock_free (size t size, void *ptr)
bool __atomic_is_lock_free (size t size, void *ptr)


上一篇: gdb
下一篇: 无
作者邮箱: 203328517@qq.com