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 声明式事务&…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
