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 声明式事务&…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...