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 声明式事务&…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...