Linux 内核编译参数
文章目录
- 前言
- 1 -Wall
- 2 -Wundef
- 3 -Wstrict-prototypes
- 4 -Wno-trigraphs
- 5 -fno-strict-aliasing
- 6 -fno-common
- 7 -Werror-implicit-function-declaration
- 8 -Wno-format-security
- 9 -fno-delete-null-pointer-checks
- 10 -std=gnu89
前言
# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"# uname -r
3.10.0-1160.el7.x86_64
vim /usr/src/kernels/3.10.0-1160.el7.x86_64/Makefile
KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \-fno-strict-aliasing -fno-common \-Werror-implicit-function-declaration \-Wno-format-security \-fno-delete-null-pointer-checks \-std=gnu89
1 -Wall
此选项在编译过程中启用了一组全面的警告信息。它有助于检测潜在问题和可疑的代码结构。
This enables all the warnings about constructions that some users consider questionable, and that are easy to avoid (or modify to prevent the warning), even in conjunction with macros.
GCC 编译器选项 -Wall 是一个常用的编译选项,用于启用大部分警告信息。它表示 “开启所有警告”,让编译器尽可能发现代码中的潜在问题,并生成相应的警告信息。
使用 -Wall 选项可以帮助开发人员改善代码质量、发现潜在的错误和不良实践。编译器会检查代码中的语法错误、类型不匹配、未使用的变量、潜在的隐患等,并生成相应的警告信息。
2 -Wundef
启用此选项时,编译器会在遇到未定义的宏时生成警告。它有助于识别使用未定义宏可能导致的问题。
Warn if an undefined identifier is evaluated in an #if directive.
GCC 编译器选项 -Wundef 用于启用对未定义宏的警告。当代码中使用了未定义的宏时,编译器会发出警告,以帮助开发人员发现潜在的问题。
使用未定义的宏可能会导致代码中的条件判断、预处理指令等产生意外的行为。编译器的警告可以帮助开发人员及时发现这些问题,避免潜在的错误。
3 -Wstrict-prototypes
此选项强制执行严格的函数原型检查。它确保函数声明包括参数类型,有助于检测函数声明和定义之间的不匹配。
GCC 编译器选项 -Wstrict-prototypes 是用于启用严格的函数原型检查的警告。当使用该选项编译代码时,编译器会检查函数声明中是否包含参数类型,并警告未声明参数类型的函数声明。
函数原型是函数的声明,其中包含函数的名称、返回类型和参数列表。在早期版本的 C 语言中,可以省略函数声明中的参数类型,这被称为隐式函数声明。然而,根据 ANSI C 和后续的 C 标准,函数原型是强制要求包含参数类型的。
使用 -Wstrict-prototypes 编译选项可以帮助检测出以下情况:
函数声明中缺少参数类型的情况。
函数声明与函数定义之间参数类型不匹配的情况。
通过启用严格的函数原型检查,可以提高代码的可读性和可靠性。它有助于捕获潜在的函数声明错误,避免因函数参数类型不匹配而引发的错误和行为不确定性。
然而,需要注意的是,并非所有的代码都需要启用 -Wstrict-prototypes 选项。在某些情况下,旧代码或特定的编译环境可能仍然使用隐式函数声明。因此,使用该选项时需要权衡考虑,并确保代码与所需的标准和规范相符。
4 -Wno-trigraphs
三字符序列是在 C 语言中可以用于替代某些字符的序列。此选项禁用与三字符序列相关的警告。
GCC 编译器选项 -Wno-trigraphs 用于禁用关于三字符序列的警告。在 C 语言中,三字符序列是由两个问号(“??”)后跟一个字符组成的序列,用于代替某些特定字符。
例如,“??=” 会被解释为 “#”,“??/” 会被解释为 “”,“??'” 会被解释为 “^”,等等。这种替换在早期的编译器中用于处理不支持特定字符的硬件和字符集限制。
然而,三字符序列的使用在现代的编程中变得相对较少,因为现代的编译器和编码环境已经具备支持更广泛字符集的能力。因此,GCC 编译器默认会发出关于三字符序列的警告,以提醒开发者可能出现的代码可读性和易于理解的问题。
通过使用 -Wno-trigraphs 选项,可以禁用这些警告信息,使编译器在遇到三字符序列时不会发出警告。这在某些情况下可能是有用的,特别是当代码中故意使用三字符序列进行特定目的的替换时。
然而,需要谨慎使用 -Wno-trigraphs,因为过度使用三字符序列可能会导致代码的可读性下降,并且可能在不同编译环境中产生不一致的结果。在现代的编程实践中,更推荐使用标准字符来代替三字符序列,以提高代码的可读性和可移植性。
5 -fno-strict-aliasing
(1)
严格别名规则是编译器中的一种优化技术。此选项禁用了严格别名规则,可以避免与别名违规相关的潜在问题。
GCC 编译器选项 -fno-strict-aliasing 用于禁用严格别名规则的优化。严格别名规则是编译器在进行优化时采用的一种策略,用于假设不同类型的指针不会指向同一个内存位置。
严格别名规则的优化假设了不同类型的指针不会引用同一个内存位置,这样编译器可以进行更有效的优化。然而,这种优化可能会导致别名违规(aliasing violation)的问题。别名违规指的是使用一个指针类型的指针来访问被另一个类型的指针所引用的对象,这可能导致未定义的行为。
通过使用 -fno-strict-aliasing 选项,可以禁用严格别名规则的优化。这样,编译器将不再假设不同类型的指针不会指向同一个内存位置,从而避免别名违规问题。禁用严格别名规则的优化可能会导致一些性能上的损失,但可以确保代码的正确性和可靠性。
需要注意的是,在某些情况下,严格别名规则的优化是有益的,可以提高代码的执行效率。因此,在使用 -fno-strict-aliasing 选项时,需要仔细权衡优化性能和代码正确性之间的取舍,并确保禁用严格别名规则的优化不会引入潜在的别名违规问题。
有关严格别名请参考:https://zhuanlan.zhihu.com/p/595286568
(2)
对应的 -fstrict-aliasing 编译选项:
The -fstrict-aliasing option is enabled at levels -O2, -O3, -Os.
GCC 编译器选项 -fstrict-aliasing 用于启用严格别名规则的优化。默认情况下,GCC 编译器会启用严格别名规则的优化,以假设不同类型的指针不会指向同一个内存位置,从而进行更有效的优化。特别是,假设一种类型的对象永远不会与不同类型的对象位于同一地址,除非类型几乎相同。例如,“unsigned int”可以别名为“int”,但不能别名为“void*”或“double”。字符类型可以别名为任何其他类型。
严格别名规则的优化假设了以下内容:
不同类型的指针不会指向同一个内存位置。
对于同一个内存位置,不同类型的指针进行读取或写入操作不会相互影响。
基于这些假设,编译器可以进行一些优化,如寄存器的使用、指令重排、常量传播等,以提高代码的性能。
然而,使用严格别名规则的优化可能导致别名违规(aliasing violation)问题。别名违规指的是使用一个指针类型的指针来访问被另一个类型的指针所引用的对象,这可能导致未定义的行为。
通过使用 -fstrict-aliasing 选项,可以显式启用严格别名规则的优化。这样,编译器将根据严格别名规则进行优化,假设不同类型的指针不会指向同一个内存位置。启用严格别名规则的优化可能会提高代码的执行效率,但需要确保代码中不存在别名违规的问题。
需要注意的是,使用 -fstrict-aliasing 选项时,必须遵守 C 语言的别名规则,以确保代码的正确性。同时,也要注意在某些情况下,严格别名规则的优化可能会导致意外的行为,特别是在涉及类型转换、联合体等复杂语法和编码技巧时。因此,使用该选项时需要仔细考虑,并进行适当的测试和验证,确保代码正确性和可靠性。
6 -fno-common
默认情况下,未初始化的全局变量可以放置在内存的共享段中,从而可以在多个目标文件之间共享。该选项禁用了这种行为,将未初始化的全局变量视为带有 “extern” 关键字定义的变量。
GCC 编译器选项 -fno-common 用于禁止将未初始化的全局变量和静态变量放置在共享的内存块中。默认情况下,GCC 允许将多个编译单元中的未初始化的全局变量和静态变量合并到一个共享的内存块中,这称为 “common” 块。
使用 -fno-common 选项可以禁用这种行为,每个未初始化的全局变量和静态变量将被分配独立的内存空间。这样做可以避免在链接时可能出现的多个对象具有相同符号的冲突问题。
需要注意的是,使用 -fno-common 选项可能会导致一些副作用:
可能会增加可执行文件的大小,因为每个未初始化的全局变量和静态变量都会分配独立的内存空间。
可能会导致一些与共享内存相关的优化失效,因为每个变量都有自己的内存空间。
7 -Werror-implicit-function-declaration
启用此选项时,隐式函数声明将被视为错误,要求所有函数都必须显式声明。它有助于检测缺少函数声明的情况。
GCC 编译器选项 -Werror-implicit-function-declaration 用于将隐式函数声明警告视为错误。默认情况下,GCC 编译器会发出警告,提示在使用函数之前未进行显式声明或包含相关的函数头文件。然而,使用 -Werror-implicit-function-declaration 选项可以将这些警告视为编译错误,导致编译过程中止。
隐式函数声明是指在使用函数之前没有显式提供函数原型或包含相关的函数头文件,从而导致编译器无法确定函数的参数和返回类型。这可能会导致潜在的问题,例如函数参数类型不匹配、返回类型不正确等。
通过使用 -Werror-implicit-function-declaration 选项,可以确保在编译过程中任何隐式函数声明都被视为错误,从而强制要求显式声明函数或包含相关的函数头文件。
8 -Wno-format-security
此选项禁用与格式化字符串安全性相关的警告。格式化字符串安全性漏洞可能在未正确控制函数(如 printf)中的格式说明符时出现。
GCC 编译器选项 -Wno-format-security 用于禁用与格式化字符串安全相关的警告。默认情况下,GCC 编译器会发出与格式化字符串函数(如 printf、sprintf 等)相关的安全性警告,以帮助检测潜在的格式化字符串漏洞。
格式化字符串漏洞是指在使用格式化字符串函数时,传递的格式化字符串与实际参数不匹配,可能导致内存溢出、信息泄露、远程代码执行等安全问题。编译器的警告可以帮助开发人员发现这些潜在的问题,并采取相应的防护措施。
通过使用 -Wno-format-security 选项,可以禁用这些与格式化字符串安全相关的警告。这在某些情况下可能是有意义的,例如在特定的代码库中已经经过充分的安全审查,或者在编写一些特殊目的的代码时,需要使用一些非标准的格式化字符串技巧。
需要注意的是,禁用格式化字符串安全警告可能会增加代码的潜在风险。因此,在使用 -Wno-format-security 选项时,开发人员需要特别小心,并确保代码中没有潜在的格式化字符串漏洞。
9 -fno-delete-null-pointer-checks
此选项禁用删除空指针检查的优化。它确保始终执行空指针检查,这对于调试和提高代码安全性很有用。
GCC 编译器选项 -fno-delete-null-pointer-checks 用于禁用删除空指针检查的优化。默认情况下,GCC 编译器允许对空指针的删除操作进行优化,因为在 C 标准中,对空指针进行删除操作是无效的。
通过使用 -fno-delete-null-pointer-checks 选项,可以禁用这种优化,确保空指针的删除操作被保留在生成的代码中。这样做的目的是为了在程序中明确地标记出对空指针的删除操作,以便在调试和错误排查时能够更容易地定位和识别相关的问题。
需要注意的是,对空指针进行删除操作是一种未定义行为,因此程序中应该避免这样的操作。然而,禁用删除空指针检查的优化可以帮助开发人员在调试和测试阶段更容易地发现和修复这类问题。
10 -std=gnu89
此选项将 C 语言标准设置为 GNU C89。它指定了编译器在编译过程中应遵循的 C 语言版本。
GCC 编译器选项 -std=gnu89 用于指定 C 语言的标准版本为 GNU C89 标准(GNU 扩展的 C89 标准)。这个选项告诉编译器按照 GNU C89 标准的语法和语义来解析和编译 C 代码。
GNU C89 是对 ANSI C89 标准的扩展,提供了一些额外的功能和特性。使用 -std=gnu89 选项可以启用这些扩展功能,以便编译使用了 GNU C89 扩展特性的代码。
相关文章:

Linux 内核编译参数
文章目录 前言1 -Wall2 -Wundef3 -Wstrict-prototypes4 -Wno-trigraphs5 -fno-strict-aliasing6 -fno-common7 -Werror-implicit-function-declaration8 -Wno-format-security9 -fno-delete-null-pointer-checks10 -stdgnu89 前言 # cat /etc/os-release NAME"CentOS Lin…...

vscode使用anaconda自带的python环境在终端运行时报错
目录 具体报错内容官方翻译报错讲人话解决方法 具体报错内容 CommandNotFoundError: Your shell has not been properly configured to use conda activate. If your shell is Bash or a Bourne variant, enable conda for the current user with$ echo ". E:\Anaconda/e…...

葡萄叶病害识别(图像连续识别和视频识别,Python代码,pyTorch框架)
葡萄叶病害识别(图像连续识别和视频识别,Python代码,pyTorch框架)_哔哩哔哩_bilibili 葡萄数据集 第一个文件夹为 Grape Black Measles(葡萄黑麻疹)病害(3783张) Grape Black rot葡…...

Oracle drop删除表如何恢复
摘要: 在 Oracle 数据库管理中,DROP 命令的误操作可能导致数据不可挽回的丢失。然而,Oracle 提供了回收站(recycle bin)功能,允许用户在删除对象后的一段时间内恢复它们。本文将介绍如何查询、启用和管理回…...

5、监测数据采集物联网应用开发步骤(5.1)
监测数据采集物联网应用开发步骤(4) Sqlite3数据库读写操作开发、异常信息统一处理类开发 本章节需要调用sqlite3及mysql-connector 安装sqlite3 Pip3 install sqlite3 安装mysql-connector pip3 install mysql-connector 验证是否安装成功,python中运行下列…...

ZZULIOJ 1148: 组合三位数之一,Java
ZZULIOJ 1148: 组合三位数之一,Java 题目描述 把1、2、3、4、5、6、7、8、9组合成3个3位数,要求每个数字仅使用一次,使每个3位数均为完全平方数。按从小到大的顺序输出这三个三位数。 输入 无 输出 按从小到大的顺序输出这三个三位数&a…...

ROS功能包目录下CMakeLists.txt
1. add_execuble CMake基础教程(24)add_executable生成目标可执行文件 CMake中add_executable的使用 CMake中的add_executable命令用于使用指定的源文件向项目(project)添加可执行文件,其格式如下: add_executable(<name>…...

Python爬虫追踪新闻事件发展进程及舆论反映
目录 实现方案 1. 确定目标新闻源: 2. 确定关键词: 3. 使用网络爬虫获取新闻内容: 4. 提取和分析新闻文章: 5. 追踪新闻事件的发展进程: 6. 监测舆论反映: 7. 数据可视化: 完整代码示例…...

block层:7. 请求下发
blk_dispatch 源码基于5.10 1. blk_mq_sched_dispatch_requests void blk_mq_sched_dispatch_requests(struct blk_mq_hw_ctx *hctx) {// 队列struct request_queue *q hctx->queue;// 队列已停止或者被暂停if (unlikely(blk_mq_hctx_stopped(hctx) || blk_queue_quiesc…...

Matlab图像处理-平移运算
几何运算 几何运算又称为几何变换,是将一幅图像中的坐标映射到另外一幅图像中的新坐标位置,它不改变图像的像素值,只是改变像素所在的几何位置,使原始图像按照需要产生位置、形状和大小的变化。 图像几何运算的一般定义为&#…...

美创科技一体化智能化公共数据平台数据安全建设实践
公共数据是当今政府数字化转型的关键要素和未来价值释放的核心锚点,也是“网络强国”、“数字中国”的战略性资源。 作为数字化改革先行省份,近年来,浙江省以一体化智能化公共数据平台作为数字化改革的支撑总平台,实现了全省公共数…...

关于单例模式
单例模式的目的: 单例模式的目的和其他的设计模式的目的都是一样的,都是为了降低对象之间的耦合性,增加代码的可复用性,可维护性和可扩展性。 单例模式: 单例模式是一种常用的设计模式,用简单的言语说&am…...

pytest笔记: pytest单元测试框架
第一步:安装 和查看版本 pycharm settings 查看 第二步: 编写test_example.py def inc(x):return x1 def test_answer():assert inc(4) 5 第三步:在当前路径下执行pytest 命令 PS E:\data\web测试\Selenium3自动化测试实战——基于Pyth…...

vulnhub Seattle-0.0.3
环境:vuluhub Seattle-0.0.3 1.catelogue处任意文件下载(目录穿越) http://192.168.85.139/download.php?item../../../../../../etc/passwd 有个admin目录,可以下载里面的文件进行读取 2.cltohes详情页面处(参数prod)存在sql报错注入 http://192.16…...

MYSQL 添加行号将行号写入到主键的列
MYSQL 添加行号 SELECT rownum: rownum 1 AS rownum, a.* FROM(SELECT rownum : 0) t,is_afxt.hk_vehicle a--或者(假设CREATED_TIME日期列数据不重复) select (select count(1)1 from is_afxt.hk_vehicle b where b.CREATED_TIME < a.CREATED_TIME) rownum ,a.* from i…...

前端命令npm 、 cnpm、 pnpm、yarn 、 npx、nvm的区别
大名鼎鼎的npm(Node Package Manager)是随同NodeJS一起安装的包管理工具,NPM本身也是Node.js的一个模块。 npm的含义有两层: npm服务器,npm服务器网址为https://www.npmjs.org,npm是 Node 包的标准发布平台,用于 Node 包的发布、…...

Linux 发行版 Debian 宣布支持龙芯 LoongArch 架构
近期,龙芯发布了 3A6000 桌面处理器,芯片的性能又一次大幅度提升,成为国产芯片的又一里程碑。 同期,LoongArch 架构的生态建设也迅速提升,开源网络引导固件 iPXE、QQ Linux 版、摩尔线程等软硬件都官宣支持龙芯 Loong…...

PConv : Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks
摘要 为了设计快速的神经网络,**许多研究都集中在减少浮点运算(FLOPs)**的数量。然而,我们观察到这种FLOPs的减少并不一定会导致相同程度的延迟减少。这主要是由于浮点运算每秒效率较低的问题所致。为了实现更快的网络,我们重新审视了流行的操作算子,并证明这种低FLOPS主…...

Python中怎么解决内存管理的问题? - 易智编译EaseEditing
Python有自动的内存管理机制,这意味着大部分情况下你不需要手动管理内存,因为Python的垃圾回收机制会自动处理不再使用的对象。然而,有时候你仍然需要关注内存管理,特别是在处理大数据、长时间运行的应用或需要最大化性能的情况下…...

【JavaEE】Spring事务-事务的基本介绍-事务的实现-@Transactional基本介绍和使用
【JavaEE】Spring 事务(1) 文章目录 【JavaEE】Spring 事务(1)1. 为什么要使用事务2. Spring中事务的实现2.1 事务针对哪些操作2.2 MySQL 事务使用2.3 Spring 编程式事务(手动挡)2.4 Spring 声明式事务&…...

CentOs下面安装jenkins记录
目录 一、安装jenkins 二、进入jenkins 三、安装和Gitee,Maven , Publish Over SSH等插件 四、构建一个maven项目 一、安装jenkins 1 wget -O /etc/yum.repos.d/jenkins.repo \ https://pkg.jenkins.io/redhat-stable/jenkins.repo 2 rpm --im…...

海康威视相机-LINUX SDK 开发
硬件与环境 相机: MV-CS020-10GC 系统:UBUNTU 22.04 语言:C 工具:cmake 海康官网下载SDK 运行下面的命令进行安装 sudo dpkg -i MVSXXX.deb安装完成后从在/opt/MVS 路径下就有了相关的库,实际上我们开发的时候只需要…...

AI助力智能安检,基于图像目标检测实现危险品X光智能安全检测系统
基于AI相关的技术来对一些重复性的但是又比较重要的工作来做智能化助力是一个非常有潜力的场景,关于这方面的项目开发实践在我之前的文章中也有不少的实践,感兴趣的话可以自行移步阅读即可:《AI助力智能安检,基于目标检测模型实现…...

开源软件的崛起:历史与未来
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...

apk 静默安装
apk 静默安装 - 欧颜柳 - 博客园 (cnblogs.com) 如果需要应用进行静默安装,则需要满足一下两个条件 1 必须添加权限 <uses-permission android:name"android.permission.INSTALL_PACKAGES" /> 2 必须是系统应用,或者系统签名应用 方法…...

Unity记录4.2-存储-从json文件获取Tile路径
文章首发见博客:https://mwhls.top/4813.html。 无图/格式错误/后续更新请见首发页。 更多更新请到mwhls.top查看 欢迎留言提问或批评建议,私信不回。 汇总:Unity 记录 摘要:从json文件获取Tile材质路径。 确定保存方案-2023/08/1…...

vue3页面传参?
...

NB水表和LoRa水表有哪些不同之处?
NB水表和LoRa水表是两种目前市场上常见的智能水表,它们在功能、性能、应用场景等方面存在一些不同之处。 一、技术方面 NB水表采用NB-IoT技术,而LoRa水表采用LoRa技术。NB-IoT技术是窄带物联网技术,它具有良好的低功耗、低成本、高覆盖、高可…...

Java进阶(6)——抢购问题中的数据不安全(非原子性问题) Java中的synchronize和ReentrantLock锁使用 死锁及其产生的条件
目录 引出场景:大量请求拥挤抢购事务的基本特征ACID线程安全的基本特征 加锁(java)synchronized锁ReentrantLock锁什么是可重入锁?如何保证可重入 滥用锁的代价?(死锁)死锁的四个必要条件死锁的案例 总结 引出 1.大量请…...

SpringBoot初级开发--加入Log4j进行日志管理打印(6)
日志记录在整个java工程开发中占着很重要的比重,因为很多问题的排查需要通过日志分析才能确认。在SpringBoot中我用得最多的就是log4j这个日志框架。接下来我们具体配置log4j. log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别&#…...