常用GCC编译选项

GCC编译选项

1. gcc -v  打出编译信息   gcc相当于工具集合
2. -W只打出编译器认为会出错的告警 -Wall 所有告警 -Wfatal_errors 在遇到第一个错误时停止编译
3. ar x 有同名的.o怎么办?
4. 重名动态库和静态库会先链接动态库,-static -shared
5. 动态库必须加-fpic,生成地址无关代码,使用相对距-离
6.  -Wl 加一个连接器参数 -rpath= 添加运行时链接库目录
7. c语言都是在编译期间优化

-o https://blog.csdn.net/kobemin/article/details/83180747
-fpic https://stackoverflow.com/questions/5311515/gcc-fpic-option?r=SearchResults

编译选项进阶:项目编译选项详解
1. -Wno-XXX 禁用某些警告
例如:-Wno-pointer-sign 屏蔽传入参数类型不一致的告警
2. -fno-common 这个表示禁止编译器把未初始化的全局变量放入common段并当成弱符号,应把一个未初始化的全局变量当做一个强符号https://blog.csdn.net/cybertan/article/details/5867191
3. -ffunction-sections -fdata-sections -Wl,–gc-sections
-ffunction-sections 和 -fdata-sections 将每个函数或符号创建为一个sections,其中每个sections名与function或data名保持一致(可以通过readelf查看段表来验证)。而在链接阶段, -Wl,–gc-sections 指示链接器去掉不用的section,开启该选项,主要是用于去掉所有函数SFP(Stack Frame Pointer)的,即在函数调用时不保存栈帧指针SFP,代价是不能通过backtrace进行调试根据堆栈信息了。通过去掉SFP,可以提高程序运行速度,达到优化程序的目的。
另外一个类似选项-fomit-leaf-frame-pointer:用于去掉子函数leaf function的SFP。
该选项属于优化选项,在指定-O选项时,也会开启该选项。
4. -fshort-enums支持给enum类型分配它声明的值域范围的字节数;
enum类型等于大小足够的最小整数类型。
也就是说
typedef enum num{
one = 1,
two = 2,
three = 3,
four = 4,
}NUM;
NUM num1;
sizeof(num1)不增加这个-fshort-enums选项的时候为4,增加后为大小为1;
-fno-short-enums则是无这个选项优化处理。gcc是默认没有-fshort-enums这个选项的;
5. -fsigned-char 将char设置为signed char类型。类似的还有
-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
6. -fstack-protector-all(公司要求必加)
避免栈溢出被攻击者利用。在缓冲区和控制信息间插入一个canary word。当缓冲区被溢出时,在返回地址被覆盖之前canary word会首先被覆盖。通过检查canary word的值是否被修改,就可以判断是否发生了溢出攻击。
7. -fmessage-length=0
默认情况下,gnu工具链编译过程中,控制台输出的一行信息是不换行的,这样,当输出信息过长时(如编译错误时的信息),会导致你无法看到完整的输出信息,加入-fmessage-length=0后,输出信息会根据控制台的宽度自动换行,这样就能看全输出信息了。
8. -fvisibility=hidden
隐藏所有符号,不能被外部使用。若某些接口需要提供给外部使用可以加上
void attribute((visibility(“default”))) foo(void)
9. -Wl,-Bsymbolic
表示强制采用本地的全局变量定义。
应用程序进行链接的时候,动态库中全局变量定义,将会被应用程序中同名的全局变量所覆盖。这样也就造成了,在动态库中修改A变量时,应用程序中的A也发生了变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值