Linux 编译内核模块出现--Unknown symbol mcount
文章目录
Linux suse:
# cat /etc/os-release
NAME="SLES"
VERSION="12-SP2"
VERSION_ID="12.2"
PRETTY_NAME="SUSE Linux Enterprise Server 12 SP2"
ID="sles"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:suse:sles:12:sp2"# uname -r
4.4.120-92.70-default
在编译SUSE Linux Enterprise Server 12 SP时,使用低版本的docker镜像编译内核模块时,加载内核模块时出现:
# dmesg
[12996.210792] Spectre V2 : System may be vulnerable to spectre v2
[12996.210892] test: loading module not compiled with retpoline compiler.
[13299.232906] test: Unknown symbol mcount (err 0)
加载内核模块时:
(1)
# dmesg
[12996.210792] Spectre V2 : System may be vulnerable to spectre v2
[12996.210892] test: loading module not compiled with retpoline compiler.
指示系统可能受到 Spectre V2 漏洞的影响,并且正在加载的模块没有使用 retpoline 编译器进行编译。
Spectre V2(CVE-2017-5715)是 Spectre 漏洞家族中的一个变种,它是一种基于推测执行的侧信道攻击。Spectre V2 漏洞影响现代处理器,可能允许攻击者访问其他进程内存中的敏感信息。
Spectre V2 漏洞利用了分支预测的缺陷,这是一种现代处理器使用的性能优化技术。通过操纵分支的推测执行,攻击者可以欺骗处理器泄露应该是不可访问的敏感信息。
为了解决 Spectre V2 漏洞,需要在硬件和软件层面上采取综合的缓解措施。硬件厂商发布了包含处理器固件更新的微码更新,以在硬件层面上缓解漏洞。此外,操作系统厂商提供了软件补丁和更新,包括支持 Retpoline 的编译器和更新的内核,以在软件层面上缓解漏洞。
Retpoline(Return Trampoline)是一种软件缓解技术,用于应对 Spectre V2 漏洞。它是一种编译器技术,修改代码中的间接分支指令,防止推测执行访问未经授权的内存位置。Retpoline 可以在不需要昂贵的硬件修改的情况下缓解 Spectre V2 漏洞。
检查内核配置:检查您的内核配置,确保已启用retpoline支持。可以通过查看内核配置文件/proc/config.gz是否启用了retpoline选项:
# zgrep CONFIG_RETPOLINE /proc/config.gz
CONFIG_RETPOLINE=y
如果输出显示 CONFIG_RETPOLINE=y,则表示retpoline已启用。
这只是警告而已,不影响模块的加载运行。
(2)
# dmesg
[13299.232906] test: Unknown symbol mcount (err 0)
gcc 的 -pg 选项,它插入 mcount() 调用以与 gprof 一起使用。
当在Linux系统中加载内核模块时遇到 “Unknown symbol mcount (err 0)” 的错误消息时,这通常表示所加载的内核模块依赖于 mcount 符号,但该符号在当前系统内核中不可用或未定义。
mcount 是一个用于性能分析和跟踪的内核符号,通常由 gcc 编译器生成的代码调用。它用于计算函数调用的计数,以便进行性能分析和跟踪操作。
从 gcc 4.6 版开始,这个 mcount() 调用现在是 fentry()。
使用的 docker 容器 gcc 版本过低,低于 gcc 4.6,因此编译内核模块时出现了mcount符号,该符号在当前系统内核中是未定义。
# nm test.ko | grep mcountU mcount
# cat /proc/kallsyms | grep mcount
ffffffff81eecb60 T __start_mcount_loc
ffffffff81f1dd78 T __stop_mcount_loc
可以看到当前内核版本没有 mcount 符号。
__start_mcount_loc 和 __stop_mcount_loc 这两个符号实际上是用于标记函数fentry()插装跟踪信息的起始和结束位置,这些符号是由编译器自动插入的。当使用 -pg 选项编译程序时,编译器会在每个函数的入口和出口处插入这些符号,以便在程序运行时收集函数调用和执行时间的数据。
__start_mcount_loc 标记了函数调用跟踪信息的起始位置,而 __stop_mcount_loc 则标记了其结束位置。这两个符号之间的范围表示了fentry() 插装数据的范围。
使用较高版本的docker(gcc)即可,比如 gcc 4.8:
# nm test.ko| grep __fentry__U __fentry__
# cat /proc/kallsyms | grep __fentry__
ffffffff815f89d0 T __fentry__
内核当前镜像中有该内核符号__fentry__。
(3)内核顶层 makefile
vim /usr/src/linux-4.4.120-92.70/Makefile
KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \-fno-strict-aliasing -fno-common \-Werror-implicit-function-declaration \-Wno-format-security \-std=gnu89 $(call cc-option,-fno-PIE)
ifdef CONFIG_FUNCTION_TRACER
ifndef CC_FLAGS_FTRACE
CC_FLAGS_FTRACE := -pg
endif
export CC_FLAGS_FTRACE
ifdef CONFIG_HAVE_FENTRY
CC_USING_FENTRY := $(call cc-option, -mfentry -DCC_USING_FENTRY)
endif
KBUILD_CFLAGS += $(CC_FLAGS_FTRACE) $(CC_USING_FENTRY)
KBUILD_AFLAGS += $(CC_USING_FENTRY)
ifdef CONFIG_DYNAMIC_FTRACEifdef CONFIG_HAVE_C_RECORDMCOUNTBUILD_C_RECORDMCOUNT := yexport BUILD_C_RECORDMCOUNTendif
endif
endif
# zgrep CONFIG_FUNCTION_TRACER /proc/config.gz
CONFIG_FUNCTION_TRACER=y# zgrep CONFIG_HAVE_FENTRY /proc/config.gz
CONFIG_HAVE_FENTRY=y# zgrep CONFIG_DYNAMIC_FTRACE /proc/config.gz
CONFIG_DYNAMIC_FTRACE=y
相关文章:
Linux 编译内核模块出现--Unknown symbol mcount
文章目录 Linux suse: # cat /etc/os-release NAME"SLES" VERSION"12-SP2" VERSION_ID"12.2" PRETTY_NAME"SUSE Linux Enterprise Server 12 SP2" ID"sles" ANSI_COLOR"0;32" CPE_NAME"cpe:/o:s…...
Pywin32 Cookbook by Eric
Writing Prompt 现在你是一名专业的Python工程师,请你根据"Pywin32_Funtion"函数的功能,为其编写一个清晰的文档说明Functions win32gui.GetWindowDC(hwnd) 描述 win32gui.GetWindowDC()函数用于获取指定窗口的设备上下文(Devi…...

indexDB入门到精通
前言 由于开发3D可视化项目经常用到模型,而一个模型通常是几m甚至是几十m的大小对于一般的服务器来讲加载速度真的十分的慢,为了解决这个加载速度的问题,我想到了几个本地存储的。 首先是cookie,cookie肯定是不行的,因为最多以只…...

Ubuntu 20.04配置静态ip
ip配置文件 cd /etc/netplan配置 根据需求增加 # Let NetworkManager manage all devices on this system network:version: 2renderer: NetworkManager # 管理 不是必须ethernets:enp4s0: #网卡名dhcp4: no #关闭ipv4动态分配ip地址dhcp6: no #关闭ipv6动态分配…...

Tushare入门小册
Tushare入门小册 一、Tushare平台介绍 Pro版数据更稳定质量更好了,我们提供的不再是直接从互联网抓取,而是通过社区的采集和整理存入数据库经过质量控制后再提供给用户。但Pro依然是个开放的,免费的平台,不带任何商业性质和目的…...

<c++开发>通信工具 -之-SOME/IP移植部署 第一篇文章
<c开发>通信工具 -之-SOME/IP移植ubuntu部署 第一篇文章 一 前言 SOME/IP (Scalable service-Oriented MiddlewarE over IP) 是一种通信协议,主要用于嵌入式系统和车载网络中的服务导向通信。SOME/IP是AUTOSAR(AUTomotive Open …...

权威的软件测试服务供应商分享,怎么获得软件安全检测报告?
我们深知在如今的数字化时代,软件安全对于企业和个人来说具有极其重要的意义。然而,许多用户对于软件安全测试报告的概念还不够清晰,也不知道如何获得这样的报告。在本文中,小编将为您简析什么是安全测试报告以及如何获取这样的报…...
管理类联考——逻辑——真题篇——按知识分类——汇总篇——二、论证逻辑——假设——第二节——搭桥假设
文章目录 第二节 假设-分类1-搭桥假设-当题干推理存在明显断点,常见形式比如:“因为A→B,C→D,所以A→D”,则正确选项为“B→C”真题(2014-39)-假设-分类1-题干推理存在明显断点-搭桥假设-建模搭桥-“因为A→B,所以A→C”,搭桥假设为“B→C”真题(2019-44)-假设-分…...

百度云BOS云存储的图片如何在访问时,同时进行格式转换、缩放等处理
前言 之前做了一个图片格式转换和压缩的服务,结果太占内存。后来查到在访问图片链接时,支持进行图片压缩和格式转换,本来想着先格式转换、压缩图片再上传到BOS,现在变成了上传后,访问时进行压缩和格式转换。想了想&am…...
go生成文件md5、sha1摘要简单示例
备注 go官方文档 https://pkg.go.dev/crypto/md5 已经给出如何使用该package生成文件或者字节数组的摘要值, 参照即可。 摘要值不是对文内容的加密,它主要用来进行checksum,就是验证两个文件内容是否一致,是否被篡改或者变化了。…...

Docker容器:docker数据管理、镜像的创建及dockerfile案例
文章目录 一、docker数据管理1.为何需要docker数据管理2.数据管理类型3.数据卷4.数据卷容器5.容器的互联 二.docker镜像的三种创建方法1.基于现有镜像创建1.1 启动镜像1.2 生成新镜像 2.基于本地模板创建2.1 OPENVZ 下载模板2.2 导入容器生成镜像 3.基于dockerfile创建3.1 dock…...
Ajax fetch Axios 的区别
AJAX:一种创建交互式网页应用的网页执行交互技术 通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。意味着:在不重新加载整个网页 的情况下,对网页某部分进行更新。 缺点: 针对MVC编程,…...

数据库结构差异对比工具
简介 前几年写了一个数据库对比工具,但是由于实现方式的原因,数据库支持有限,所以重新设计了一下,便于支持多种数据库,并且更新了UI。 新版地址:https://gitee.com/xgpxg/db-diff 旧版地址:h…...
Shell编程学习之breakcontinuereturn的应用
Shell编程中的break关键字:break关键字:退出最近的循环,后续循环不再执行;break关键字用法: break #结束本层循环 break 数字n #结束n层循环测试代码1: #!/bin/bashfor((i1;i<6;i)) dofor((…...

有趣的数学 数学建模入门二 一些理论基础
一、什么是数学建模? 现实世界中混乱的问题可以用数学来解决,从而产生一系列可能的解决方案来帮助指导决策。大多数人对数学建模的概念感到不舒服,因为它是如此开放。如此多的未知信息似乎令人望而却步。哪些因素最相关?但正是现实世界问题的…...

Spring复习:(55)ApplicationContext中BeanFactoryPostProcessor是怎么添加到容器的?
容器创建时会调用AbstractApplicationContext的refresh方法,其中会调用invokeBeanFactoryPostProcessor方法,如下图 invokeBeanFactoryPostProcessors代码如下: 其中调用的PostProcessorRegistrationDelegate的invokeBeanFactoryPostProcess…...
给wordpress添加关键词与描述
Wordpress网站的关键字及网页描述关系网站对搜索引擎的友好程度,如果自己手动加显然太折腾了,那如何让WordPress博客自动为每篇文章自动关键字及网页描述。每篇文章的内容不同,我们该如何让wordpress自动添加文章描述和关键词呢?下…...

Verilog 入门
Verilog 入门 本内容来自 牛客网Verilog入门特别版 1、一个没有输入和一个输出常数1的输出的电路,输出信号为one module top_module(one);output wire one;assign one 1b1; endmodule2、创建一个具有一个输入和一个输出的模块,其行为类似于电路上的连…...

shell 简单且常用的几种
目录 一、配置环境的shell脚本 二、系统资源脚本 一、要求 二、脚本内容 三、脚本解析 四、赋权并验证 三、查看当前内存的总大小、实际使用大小、剩余大小、显示使用率百分比的脚本 一、第一种方法 二、验证 三、第二种方法 四、验证 四、查看网卡实时流量脚本 一…...

redis基本介绍以及在node中使用
文章目录 引言一、什么是redis1. redis简介2. redis的特点3. redis的应用场景 二、redis在windows下安装1. 下载安装2.验证是否安装成功3. 配置环境变量 三、redis-cli常用命令介绍1. redis-cli2. keys *3. set key value4. get key5. exists key6. del key7. info8. flushdb9.…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...