LWN:5.13 内核中导出符号的变化!

Android native开发严重问题总结 本文用于总结开发过程中遇到的重要问题分析原因及其解决方案 1、libnativeloader.so" is not accessible for the namespace “classloader-namespace” 原因:安卓高版本中将会限制三方APP访问非NDK公开so库,即不能访问system/lib/lib64下面的私有so库。 两种情况的解决方案: 第一:若是系统system app,该问题的产生原因是app是通过install的,这样不可行,必须将该模块在编译产品后的system/app路径 阅读详情

关注了就能看到更多这么棒的文章哦~

Exported-symbol changes in 5.13

By Jonathan Corbet
May 17, 2021
DeepL assisted translation
https://lwn.net/Articles/856312/

多年来,内核社区对于是否将 kernel 内部内核符号(kernel symbol)导出供 loadable module 使用,一直存在着很多争议。导出(export)符号表,一般来说就会将具体实现细节暴露给了外部代码,也就是可能会被按照意料之外的一些方式来使用(或滥用),并且未来要想再对这些函数进行修改的话就会面临极大的困难。目前并没有任何机构来监管 symbol export,也没有什么官方流程来对这些 export 进行批准。每次都是有人发现了他们希望看到的改动时,才会有相关讨论出现。但是,我们可以很容易地对比出新的 kernel 版本比起之前来说有哪些 export symbol 发生了变化,这样一来我们就可以了解到底层究竟发生了哪些变化。

内核有数千个的函数以及数据结构,其中大多数都是某些源文件自己的私有内容,其他的则是整个内核都可以使用的。但 loadable module 的地位很特殊,它们只能访问那些用 EXPORT_SYMBOL()(或它的其他变体) 明确 export 出来的符号。内核 Image 代码可以使用的符号中,有很多都是 loadable module 无法使用的。这样做的目的是为了使 module 的接口数量尽量少一些,方便管理。

不过,这个目标目前看来并未实现。5.12 版的 kernel 向 module 总共 export 了 31695 个符号,这并不是一个数量很少的接口列表。这个数字在 5.13-rc1 中增长到了 31822 个。这意味着增加了 127 个符号,但实际情况比这更复杂,在这段时间里有 244 个之前 export 的符号被删除,而新增了 371 个。细节可以在这个页面(https://lwn.net/Articles/856313/)上看到。

有些改动其实不算是新增或删除,实际上是改了个名字。例如,pmbus_do_probe()在 5.13 中就不再按照这个名字 export 了,它现在(按照编者随便定义的标记来说的话)是 PMBUS::pmbus_do_probe()。换句话说,这个符号已经从全局命名空间(global namespace)移到了子系统自己特定的 namespace。2018 年开始支持对 kernel symbol export 时使用 namespace,但目前看来进展不是很快。5.13 内核增加了一个新的 namespace(PMBUS),这个子系统内的 export symbol 都正在迁移过来。现在内核中有 18 个关于 symbol 的 namespace:

CRYPTO_INTERNAL, FIRMWARE_LOADER_PRIVATE, LTC2497, MCB, NVME_TARGET_PASSTHRU, PMBUS, SND_INTEL_SOUNDWIRE_ACPI, SND_SOC_SOF_INTEL_HDA_COMMON, SND_SOC_SOF_MERRIFIELD, SND_SOC_SOF_HDA_AUDIO_CODEC, SND_SOC_SOF_HDA_AUDIO_CODEC_I915, SND_SOC_SOF_INTEL_HIFI_EP_IPC, SND_SOC_SOF_INTEL_HIFI_EP_IPC, SND_SOC_SOF_ACPI_DEV, SND_SOC_SOF_PCI_DEV, SND_SOC_SOF_XTENSA, SOUNDWIRE_INTEL_INIT, and TEST_FIRMWARE.

显然,目前位置 sound 子系统是最热心的 symbol namespace 用户。

export 出来的 symbol 中,许多其他改动都是来自于内核内部的代码重构。在 bit-finding library 中再进行一些优化,导致 find_first_bit() 这类函数都变成了头文件中的 inline 函数,这些函数不再需要 export。但它们底层调用的 find_first_bit() 之类的函数,现在就需要 export 了。vmem_map 这个通用符号是专门针对 ia64 架构的,既然 ia64 放弃了对 VMEMMAP memory model 的支持,那么这个 symbol 也就被移除了。wimax 相关的 symbol 已经跟着那些不再流行的 WiMAX 驱动程序一起消失了。像 rt_mutex_destroy() 这样的函数被删除了则是因为它们没有什么地方会用到。

新增的许多 symbol 都是跟新功能相对应的。例如,alloc_pages() 就是跟着 batch page allocation 这个功能一起加进来的。还有一些 symbol 就不那么清晰易懂了,比如说,dotdot_name 是什么意思?相关的 commit 中指出这是一个 "会有用的常量:用于表示'…'的 struct qstr",很多人估计会觉得这个说法很难理解。它实际上是为文件系统代码提供了一个快捷方式,使其能够引用名为 "… " 的目录,不用再将其封装在 "quick string" structure(用于在虚拟文件系统层中传递字符串)之中了。有些文件系统在 5.13 中开始使用它。

一般来说,如果 mainline kernel 中没有地方会用到某个 kernel symbol 的话,它就不应该被 export。这条规则通常是被遵守的,但也有一些例外。举个例子,zynqmp_pm_pinctrl_get_function()在 5.13-rc1 中被 export 出来,但 kernel 里面并没有地方在用。其他许多也被 export 出来的 zynqmp_ 开头的符号(都与 Xilinx Zynq SoC 有关)也没有被广泛使用,看起来都应该隐藏在它们自己的 namespace 中。另一个导出但未被使用的符号是 __cfi_slowpath_diag(),这是 Clang control-flow-integrity 实现代码的一部分,也在本次合并窗口之内被合并了。导出这个符号的原因尚不完全清楚。__cpu_dying_mask()也是在 5.13 中引入并 export 的,内核中也没有地方使用到。还有许多其他类似情况。"先导出,以备不时之需" 似乎是内核开发者的一个常见习惯。

在 5.13 内核中,增加了 11 个 devm_ 开头的 export 符号,还有两个内部使用的__devm_开头的符号。并非所有这些都已经被用起来了,但它们确实是典型的、人们希望 export 出去的符号。这些函数是用来做 "managed device",也就是使编写设备驱动程序更容易,并在 device 关闭时方便释放所分配的资源,从而更加安全。现在已经有超过 300 个这样的函数被 export 到 module 之中,而且这个列表看起来还会继续增加。

direct rendering manager(DRM)图形子系统这次增加了 17 个 drm_ 开头的 export symbol。DRM 显然是内核中最复杂的驱动 API 之一,在 5.13 中导出的符号不少于 850 个。人们开始理解为什么这个子系统的开发者会把文档放在第一优先级。如果没有文档,这些 API 就很难使用了。当然,这也是因为 graphics processor 都是很复杂的设备,所以 API 会很多。

既然 kernel 提供了接近 32000 个 export symbol,还号称是一个 "尽量缩小规模" 的 module 接口,可以说明内核整体来说也是一个非常复杂的环境。这种复杂性反映在很多地方,比如它提供给用户空间的接口越来越多,提供给 loadable module 接口越来越多。多年来,这些接口的规模已经增加了许多,并且往往没有经过深入的 review。好消息是,export symbol 还是算作是 kernel 的内部接口,也就是随时可以更改。因此,也许将来有一天这个 list 会变小也说不定,但 5.13 周期里是不会发生这个情况了。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

Linux系统下MTD/CFI驱动介绍 本文介绍了Linux系统下MTD/CFI驱动以及一些编程要点。 立即下载

相关推荐

获取Linux内核未导出符号的几种方式

从Linux内核的2.6某个版本开始,内核引入了导出符号的机制。只有在内核中使用EXPORT_SYMBOL或EXPORT_SYMBOL_GPL导出的符号才能在内核模块中直接使用。然而,内核并没有导出所有的符号。例如,在3.8.0的内核中,do_page_fault没有被导出。   而我的内核模块中需要使用do_page_fault,那么有那些方法呢?这些方法分别有什么优劣呢?   下面以do_page_fault为例,一一进行分析:   1、修改内核,添加EXPORT_SYMBOL(do_page_fault)或EXPORT_SYMBOL_GPL(do_page_fault)。

.cfi指令解读(二)

转自:http://sourceware.org/binutils/docs/as/CFI-directives.html 先看吧,时间太紧了没时间翻译。等什么时候有时间再说吧。 7.11 .cfi_sections section_list .cfi_sections may be used to specify whether CFI directives should emit .e

lijiatong1005的专栏 1万+

从TL431光耦到集成隔离器:3种反激电源反馈方案全对比,你的项目到底该选哪个?

本文深入对比了反激电源设计中TL431光耦、集成隔离器和原边反馈三种主流反馈方案的优缺点,帮助开发者在电源设计中选择最适合的方案。从精度、成本、隔离等级等多维度分析,为反激式(Flyback)拓扑的应用提供实用选型指南。

weixin_30536513的博客 399

高通8475平台kernel_write、kernel_read函数编译报未定义问题的解决办法

我的驱动是在kernel_platform/msm-kernel/drivers/misc这个目录下添加的,我需要在对应的out目录中去找对应的xxx.mod.c文件,就是kernel_platform/out/msm-waipio-waipio-gki/msm-kernel/drivers/misc/xxx.mod.c。在abi_gki_aarch64.xml文件中声明函数需要用到的type-id根据文件中其他已经声明过的函数,寻找与我们需要声明的函数相同类型的type-id直接复制粘贴即可.

m0_66158960的博客 2287

rk3588 Android HDMI IN热插拔解决

1、公司在使用 别的厂商的板卡遇到一个问题,开机我们的app自启就会闪退,后来定位发现是camera 的open出错了,这个问题的出现是因为没有插HDMI IN输入的问题导致的,所以需要对HDMI IN的热插拔进行检测,后面我把这个问题也顺利解决了。下面是我的尝试和使用的解决办法。3、话不多说,我用的是读取系统文件实现的,但是这个方法,需要有status文件的系统读权限,可以修改设备下的/vendor/etc/init/hw/init.rk3588.rc文件修改的权限,这个问题交给自己或者厂家协商解决。

qq_54089476的博客 1918

从理论到实践:用CST微波工作室完成单站雷达RCS仿真的完整指南

本文提供了一份利用CST微波工作室进行单站雷达RCS仿真的完整实践指南。文章深入剖析了从求解器选择(重点推荐积分方程法)、模型与材料设置、平面波激励定义到后处理分析的完整逻辑链条,旨在帮助工程师不仅完成仿真,更能理解其背后的物理原理与工程考量,从而高效、精准地评估目标的电磁散射特性。

weixin_29256771的博客 180

Kernel panic - not syncing: CFI failure

Kernel panic - not syncing: CFI failure

qq_34503002的博客 2162

Python实现课程时间表

用Python实现课程表功能

life is like a play 2040

CFI/CFG 安全防护原理详解

文章目录1. 简介1.1 控制流攻击历史1.2 CFI的基本概念1.3 CFI发展历史2. Orig CFI2.1 Windows CFG的实现3. CCFIR4. VTV5. Kernel CFI5.1 forward-edge protection CFI(Control-Flow Integrity)5.2 backward-edge protection SCS(Shadow Call Stack)5.3 Shared library support(Cross-DSO)6. 利用硬件来提升CF

pwl999的博客 1万+

AI穿透式智慧粮仓

本报告基于 2025-2026 年全国多地智慧粮储实践案例,系统分析了 "AI + 穿透式" 智慧粮储体系的技术架构、AI 算法应用、提质增效成效、区域差异化特点及未来发展趋势。该体系通过多模态感知、智能算法与管控平台的深度融合,实现粮食存储全流程精准感知、智能预警与科学调控,显著降低储粮损耗与运营成本,大幅提升储粮安全水平与管理效率。报告梳理了各地差异化实践路径,提出针对性发展建议,为推动我国粮食仓储高质量发展、筑牢国家粮食安全防线提供参考。

reset2021的博客 229

Python爬虫实战:爬取携程旅游平台数据,我拆解了动态反爬+Cookie续命(附完整可运行代码)

反爬类型表现形式应对思路sign参数返回403/空数据逆向JS还原加密逻辑Cookie时效登录后1小时Cookie失效定时刷新Cookie/保存登录态行为检测爬取过快触发验证码模拟真人延时/随机点击IP封禁单IP爬取超50条数据被封付费代理池/降低请求频率爬取携程旅游平台数据的核心,不是“简单的HTTP请求”,而是“理解平台的反爬逻辑并合规适配”——从sign参数破解到Cookie维护,再到行为模拟,每一步都是对HTTP协议、前端加密、用户行为的深度理解。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1713

CFI in Android Kernel Security ppt略读 - 来自Linux Security Summit USA2018

目录 一、Android内核漏洞概览 访问控制 seccomp sandboxing 不需要权限在userland就可以被触发的bug 不从userland也可以被触发的bug 内存安全对所有的内核漏洞进行分类 二、CFI(Control Flow Integrity) 记录一下早上(20180828)看的这个ppt,免得白看了。ppt来自Linux Security Summit...

think_ycx的专栏 6160

基于深度学习的图像识别技术在农业领域中的应用

是识别"病害种类"还是"病害严重度分级"?前者是分类,后者常需分割或分级回归。是叶片级(离体叶片图像)、植株级(田间单株)、地块级(无人机俯拍)?视角不同,模型差异巨大。实时无人机巡检可能要求 < 50 ms/帧(Jetson Orin),而离线测报可接受秒级推理。类别标签、结构化 JSON、GIS 图斑、报警事件?

AI天才研究院 2164

LWN: 如何让LTTng能继续正常工作?

关注了就能看到更多这么棒的文章哦~How to unbreak LTTngByJonathan CorbetApril 20, 2020原文来自:https://lwn.net/Art...

Linux News搬运工 303

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Linux两种方法来处理传入TCP数据段:快速路径(Fast Path)和慢速路径(Slow Path)

在Linux中,有两种方法来处理传入TCP数据段:快速路径(Fast Path)和慢速路径(Slow Path)。使用快速路径只进行最少的处理,如处理数据段、发生ACK、存储时间戳等。使用慢速路径可以处理乱序数据段、PAWS、socket内存管理和紧急数据等。Linux通过预测标志来区分这两种处理模式,预测标志存储在tp->pred_flags,生成这个标志的函数是__tcp_fast_path_

海边顽石的专栏 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【深入理解Linux内核】EXPORT_SYMBOL宏解析

内核版本:5.10.0 相关头文件: include/linux/export.h #include <linux/export.h> 宏定义: #define EXPORT_SYMBOL(sym) _EXPORT_SYMBOL(sym, "") #define EXPORT_SYMBOL_GPL(sym) _EXPORT_SYMBOL(sym, "_gpl") #define EXPORT_SYMBOL_GPL_FUTURE(sym) _EXPORT_SYMBOL(s.

诸葛一帆丶的博客 2691

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

libdl so的基本使用

libdl so的基本使用

qq_43741193的博客 987

linux系统调用_Linux系统调用过程分析

背景为了安全,Linux 中分为用户态和内核态两种运行状态。对于普通进程,平时都是运行在用户态下,仅拥有基本的运行能力。当进行一些敏感操作,比如说要打开文件(open)然后进行写入(write)、分配内存(malloc)时,就会切换到内核态。内核态进行相应的检查,如果通过了,则按照进程的要求执行相应的操作,分配相应的资源。这种机制被称为系统调用,用户态进程发起调用,切换到内核态,内核态完成,返回用...

weixin_39637363的博客 709

warn_slowpath_common

warn_slowpath_common   出现这个函数,表示当前运行的状态不对,有BUG,但可能不是致命错误。 void warn_slowpath_null(const char *file, int line) { warn_slowpath_common(file, line, __builtin_return_address(0), NULL);

Hansel的专栏 6333

CFI规范纪要

Common Flash Interface (CFI)规范定义NOR flash和CPU之间的接口,方便CPU查询NOR flash的重要信息。 1. 如何进入CFI查询模式 此表表示访问Nor数据或者读查询结构的时序 读Nor数据或者读查询结构数据都至少要2个总线周期,第一个周期写一个特定的命令,第二个周期读Array地址或者Query地址数据 spec中指定的地址都是基于chip支持的...

weixin_33928467的博客 967

hi3519v101_big_little_defconfig

# # Automatically generated file; DO NOT EDIT. # Linux/arm 3.18.20 Kernel Configuration # CONFIG_ARM=y CONFIG_ARM_HAS_SG_CHAIN=y CONFIG_MIGHT_HAVE_PCI=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y CONFIG_HAVE...

好习惯成就伟大 6933

linux 内核符号表,内核符号表详解

内核符号表详解http://hi.baidu.com/apollon2010/blog/item/ecbe1d5a3bd2ec8a800a18dc.html关键词: Kernel Symbol Table、/proc/ksyms、system.map、Oops、LKM 这应该是一个很基本的内核概念,和模块、系统调用等一样基础,但牵涉的东西却一点也不窄,一毫也不浅。(但也不深:-) 【内...

weixin_29568097的博客 1300

1)unknown symbol问题

1、出现这个错误的现象是系统起不来,查看串口打印信息有unknown symbol的函数,这种错误一般是函数没有定义或者没有用EXPORT SYMBOL输出函数,导致其他模块看不到,一个模块没有加载成功时,会导致其他依赖的模块也加载不起来,出现更多的unknown symbol问题,出现这种情况先解决第一个出现的,如果再有则依次解决;

u012340443的专栏 5231

【Linux 内核 内存管理】物理分配页 ⑨ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | retry 标号代码分析 )

一、retry 标号代码分析、 二、retry 标号完整代码

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1813

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 390
上一篇: LWN: 将group成员资格固定下来!
下一篇: LWN: BPF可以调用内核函数了!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值