vmlinux, System.map; cmake的find_package(Clang)产生的变量们; geogebra单位切向量(简单例子)

linux4.15.y内核中的函数个数

依赖关系: vmlinux, vmlinux.bin, bzImage

cd  /bal/linux-stable/
file  vmlinux
#vmlinux: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, BuildID[sha1]=b99bbd9dda1ec2751da246d4a7ae4e6fcf7d789b, not stripped
#文件大小 20MB, 19940148Bfile arch/x86/boot/compressed/vmlinux.bin
#arch/x86/boot/compressed/vmlinux.bin: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, BuildID[sha1]=b99bbd9dda1ec2751da246d4a7ae4e6fcf7d789b, stripped
#文件大小 14MB, 13706624Bfile  arch/x86/boot/vmlinux.bin
#arch/x86/boot/vmlinux.bin: data
#文件大小 6.5MB, 6752568Bfile  arch/x86/boot/bzImage 
#arch/x86/boot/bzImage: Linux kernel x86 boot executable bzImage, version 4.14.332+ (z@shinelon) #1 SMP Sat Jan 6 19:26:05 CST 2024, RO-rootFS, swap_dev 0X6, Normal VGA
#文件大小 6.5MB , 6767424B

编译产物ELF文件vmlinux 中的函数个数

cd /bal/linux-stable/readelf -s vmlinux.o | grep FUNC | wc -l  #39998
readelf -s vmlinux | grep FUNC | wc -l   #39998readelf -s vmlinux.o | grep OBJECT  | wc -l   #43012
readelf -s vmlinux | grep OBJECT  | wc -l    #42644readelf -s vmlinux.o | wc -l   #95312
readelf -s vmlinux | wc -l   #85192

clang插件观测到的函数个数

sqlite3 -readonly ./SrcFileFuncIdGenService/fn.db "select count(*) from tbl_Func"  #51284

vmlinux

grep "vmlinux" /bal/make.log, 找到生成vmlinux的链接命令:

ld -m elf_i386 \
#指定目标架构为 32 位 x86 ELF 格式。
-z noexecstack \
#禁用栈的执行权限,提高安全性。
--emit-relocs \
#生成重定位信息。
--discard-none \
#不丢弃任何未使用的部分。
--build-id \
#为输出文件生成 Build ID。
-o vmlinux \
#指定输出文件名为 vmlinux。
-T ./arch/x86/kernel/vmlinux.lds \
#使用指定的链接脚本。
--whole-archive built-in.o --no-whole-archive \
#开始whole-archive ... 结束whole-archive, 即 强制包含 built-in.o 中的所有目标文件。
--start-group lib/lib.a arch/x86/lib/lib.a --end-group \
#将库文件 lib/lib.a 和 arch/x86/lib/lib.a 包围在一个组内,确保解析所有符号。
.tmp_kallsyms2.o # 输入的目标文件。

find /bal/linux-stable -path "*x86*Makefile" | xargs -I@ grep -Hn "vmlinux:" @ ,找到有目标vmlinux的:

/bal/linux-stable/arch/x86/boot/Makefile:111:$(obj)/compressed/vmlinux: FORCE
/bal/linux-stable/arch/x86/boot/compressed/Makefile:118:$(obj)/vmlinux: $(vmlinux-objs-y) FORCE

System.map

grep "System.map" make.log,主要有:/bin/bash ./scripts/mksysmap vmlinux System.map

cat /bal/linux-stable/scripts/mksysmap, 此文件mksysmap只有一行:
$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)\|\( \.L\)\|\( L0\)' > $2

带入参数后为:
$NM -n vmlinux | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)\|\( \.L\)\|\( L0\)' > System.map

chatgpt的解释开始

这个命令使用了 nm 命令来提取 Linux 内核 (vmlinux) 的符号表信息,并通过 grep 进行过滤,将结果保存到 System.map 文件中。下面是各个过滤条件的含义:

  • [aNUw] 这是一个字符类,匹配符号的类型。在这里,它过滤掉了类型为小写 ‘a’、‘N’ 或 ‘w’ 的符号。这通常是与代码、未定义符号或弱符号相关的标志。

  • \(__crc_\) 匹配包含 ‘_crc’ 的符号。这样的符号通常是与内核中的 CRC (Cyclic Redundancy Check) 相关的。

  • \$[adt] 匹配以 ‘ a ′ 、 ′ a'、' ad’ 或 ‘$t’ 开头的符号。通常这些符号表示代码、数据或文本段。

  • \.L 匹配以 ‘.L’ 开头的符号。这样的符号通常是由编译器生成的本地标签。

  • L0 匹配以 ‘L0’ 开头的符号。这也可能是编译器生成的本地标签。

通过这些过滤条件,命令排除了一些在内核符号表中不需要的信息,集中保留了主要的符号。这有助于提高 System.map 文件的可读性,使得在进行内核调试和分析时更容易找到感兴趣的符号。System.map 文件对于内核调试非常有用,因为它提供了符号名称和对应的内存地址,帮助开发人员理解和定位内核中的各种符号。

chatgpt的解释结束

makefile2graph 尝试可视化Makefile的依赖关系

sudo apt install makefile2graph
makefile2graph /bal/linux-stable/arch/x86/boot/compressed/Makefile  > /bal/makefile2graph.txt

将文件makefile2graph.txt的内容粘到 https://dreampuf.github.io/GraphvizOnline,选osage、png:在这里插入图片描述
得到一个14MB的图片,只能缩略传到这里:
在这里插入图片描述

, 实际图片

用makefile2graph直接可视化Makefile一定是不完整的,因为很显然:linux4是经过演化的,其编译过程的公共部分一定是抽象过的,而直观的依赖关系 可以体现在 编译过程中的(编译、链接)命令 序列。

类似于makefile2graph的工具有:

chatgpt回答开始

有几种工具可以用于将Makefile的依赖关系以图形化或其他方式展现出来。以下是一些常见的工具:

  1. Graphviz:

    • 描述: Graphviz 是一个开源的图形可视化工具集,可以用于绘制图形,包括依赖图。
    • 使用方式: 你可以使用 dot 命令行工具来生成依赖图。例如:
      make -Bnd | make2graph | dot -Tpng -o makefile.png
      
      其中,make -Bnd 用于获取Makefile的依赖关系,make2graph 将其转换为Graphviz的输入格式,dot 用于生成图形。
  2. Remake:

    • 描述: Remake 是一个增强版的 Make 工具,支持交互式查看和修改Makefile的依赖关系。
    • 使用方式: 通过运行 remake -x 进入交互模式,然后可以使用 graph 命令生成依赖图。
  3. CMake:

    • 描述: CMake 是一个跨平台的构建系统,可以生成各种构建文件,包括依赖图。
    • 使用方式: 通过在CMakeLists.txt文件中添加相关指令,然后运行CMake生成构建文件,并使用相应工具查看依赖图。
  4. makefile2graph: (此即上面用的)

    • 描述: makefile2graph 是一个专门为Makefile设计的工具,用于生成依赖图。
    • 使用方式: 安装 makefile2graph 后,运行 makefile2graph yourMakefile | dot -Tpng -o makefile.png 来生成图形。
  5. cmake-graph:

    • 描述: cmake-graph 是一个用于可视化CMake项目的工具,也可以用于Makefile。
    • 使用方式: 安装 cmake-graph 后,运行 cmake-graph yourMakefile | dot -Tpng -o makefile.png 来生成图形。

使用这些工具,你可以更好地理解和可视化Makefile中的依赖关系,以及构建过程中的各个步骤。选择适合你项目的工具,并根据需要进行配置。

chatgpt回答结束

结论

由此可见 , linux4.15.y内核编译过程中, clang插件观测到的函数个数(表tbl_Func中行数51284)比实际编译产物vmlinux中的函数个数(FUNC类型的符号数39998) 多了大约1万个函数

cmake 比较两次记录的所有变量差异

运行效果:

find_package(Clang REQUIRED CONFIG)一共新增了约79个cmake变量,如下:

保存cmake当前变量们并与上次变量们比较,第【64】行,退出码:【0】, 标准输出: 【比较命令:‘diff /tmp/cmake_vars_1200 /tmp/cmake_vars_1201’ , 差异行数:79 /tmp/cmake_vars_diff_1200_1201】, 错误输出:【】

在这里插入图片描述

例子 文件 CMakeLists.txt

#文件名: CMakeLists.txt
#...
save_cmake_vars__cur_diff_prev(${CMAKE_CURRENT_LIST_LINE})
find_package(Clang REQUIRED CONFIG)
save_cmake_vars__cur_diff_prev(${CMAKE_CURRENT_LIST_LINE})  #此为第64行
#...

文件名: diff2f.sh

#文件名:  diff2f.sh
#!/usr/bin/env bash# me.sh  ${_OutFPathPrefix} ${_prevVarsFIdx} ${gVarsFIdx}
#若参数少于3个,则退出(退出码为55)
[ $# -lt 3 ] && exit 55_OutFPathPrefix=$1
_prevVarsFIdx=$2
gVarsFIdx=$3
_prevOutFPath="${_OutFPathPrefix}${_prevVarsFIdx}"
outFPath="${_OutFPathPrefix}${gVarsFIdx}"
resultF="${_OutFPathPrefix}diff_${_prevVarsFIdx}_${gVarsFIdx}"echo -n "比较命令:‘diff ${_prevOutFPath} ${outFPath}’ , "
echo -n "差异行数:"
diff --side-by-side --suppress-common-lines ${_prevOutFPath} ${outFPath} > $resultF ;
wc -l $resultF |  perl -pe 'chomp if eof'
#用命令 “ perl -pe 'chomp if eof'  ” 删除wc输出的换行符号

文件名: save_vars__cur_diff_prev.cmake

#文件名: save_vars__cur_diff_prev.cmake
set(_Text_gVarsFIdxDesc "变量描述: 'cmake CACHE (INTERNAL)' 即 cmake全局(同级)变量")
set(_OutFPathPrefix "/tmp/cmake_vars_")#如果从没有定义过全局变量gVarsFIdx 则定义该全局变量
if(NOT DEFINED gVarsFIdx)set(gVarsFIdx 0 CACHE INTERNAL  ${_Text_gVarsFIdxDesc})# 'CACHE INTERNAL'变量gVarsFIdx 写入在文件  ./cmake-build-debug/CMakeCache.txt :#gVarsFIdx:INTERNAL=数值message(STATUS "初始化 gVarsFIdx=${gVarsFIdx}")
endif()function(save_cmake_vars__cur_diff_prev _CMAKE_CURRENT_LIST_LINE)
#    message(STATUS "函数进入 gVarsFIdx=${gVarsFIdx}")MATH(EXPR _prevVarsFIdx "${gVarsFIdx} - 1")
#    set(_prevOutFPath "${_OutFPathPrefix}${_prevVarsFIdx}")set(_curVarsFIdx "${gVarsFIdx}")# 获取 cmake变量们get_cmake_property(_varNames VARIABLES)# cmake变量们写入文件set(_curOutFPath "${_OutFPathPrefix}${gVarsFIdx}")file(WRITE ${_curOutFPath} "")foreach(_varName ${_varNames})if (_varName MATCHES "^_"  #忽略_开头的变量名OR _varName STREQUAL "gVarsFIdx") #忽略此脚本用到的变量名gVarsFIdx
#            message(STATUS "忽略变量名【${_varName}】")continue()endif()#向文件中写入一行file(APPEND ${_curOutFPath} "${_varName}=${${_varName}}\n")endforeach()#文件名下标 自增1MATH(EXPR _nextVarsFIdx "${gVarsFIdx} + 1")set(gVarsFIdx ${_nextVarsFIdx} CACHE INTERNAL  ${_Text_gVarsFIdxDesc})
#####
# 执行 diff 命令
execute_process(
#        COMMAND   bash -x  ...COMMAND   bash  /bal/clang-add-funcIdAsm/cmake_script/save_vars__cur_diff_prev/diff2f.sh ${_OutFPathPrefix} ${_prevVarsFIdx} ${_curVarsFIdx}RESULT_VARIABLE shExitCodeOUTPUT_VARIABLE shStdOutERROR_VARIABLE shStdErr
)message(STATUS "保存cmake当前变量们并与上次变量们比较,第【${_CMAKE_CURRENT_LIST_LINE}】行,退出码:【${shExitCode}】, 标准输出: 【${shStdOut}】, 错误输出:【${shStdErr}】")
#message(STATUS "函数出来 gVarsFIdx=${gVarsFIdx}")endfunction()# 调用函数保存所有变量
#save_cmake_vars__cur_diff_prev()

geogebra单位切向量(简单例子)

下载页面 —> GeoGebra5下载页面 --> GeoGebra5 Linux版本下载地址

或GeoGebra在线使用

启动 /app/GeoGebra-Linux-Portable-5-2-817-0/geogebra-portable后 在 最底下"Input"输入栏 一条一条输入以下命令(不包括#开头的注释行):

cent=(0,0)
t=Slider(0,10)
r=Slider(1,5)
cir=Circle(Point(cent),r)
p_c=Point({r sin(2π t), r cos(2π t)})
#v_r=Vector(p_c)
#UnitPerpendicularVector(v_r) #这个向量起点不能指定,想要起点在p_c
v_{utp}=UnitVector(Tangent(p_c, cir))

再导出 gif动画
在这里插入图片描述

导出的gif动画如下
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/620042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp组件定义

自定义组件 新建在/components/组件名.vue文件 组件文档结构 <template><view>......</view> </template> <script>export default {name: "组件名称",//属性自定义props: {属性名称: {type: String, //属性类型value: "值&quo…

SQL Server 配置远程连接

Windows 安装好 SQL Server 的 SSMS,打开SSMS配置远程连接 找到 配置管理器 启用 TCP/IP 打开防火墙设置 新建入站规则 端口TCP - 特定本地端口 (1433)允许连接下一步名称完成 重启 SQL Server 服务

ubuntu安装node

1 下载 node 官网下载 如果需要其他版本&#xff0c;点击上图的Other Downloads 这里下载的版本是20.11.0 Linux Binaries (x64)&#xff0c;下载下来后是node-v20.11.0-linux-x64.tar.xz这样的格式&#xff0c;直接右键解压得到如下目录&#xff1a; 直接拷贝该文件夹到指定目…

高精度恒流/恒压(CC/CV)原边反馈功率转换器

一、产品概述 PR6214是一款应用于小功率AC/DC充电器和电源适配器的高性能离线式功率开关转换器。PR6214采用PFM工作模式&#xff0c;使用原边反馈架构&#xff0c;无需次级反馈电路&#xff0c;因此省去了光耦和431&#xff0c;应用电路简单&#xff0c;降低了系统的成本和体积…

线程池相关参数配置介绍

最近几天在测境碰到一个问题&#xff0c;httpclient 在使用线程池时, 间隔性的出现 NoHttpResponseException 异常。 ​​​​​​​httpclient org.apache.http.NoHttpResponseException: host:443 failed to respond 用了连接池很多年了, 一搜自己的博客, 竟然没做过一次整…

面试宝典之JVM优化

J01、类加载的几个过程&#xff1f; 加载、验证、准备、解析、初始化。然后是使用和卸载了 J02、Minor GC 与 Full GC 分别在什么时候发生&#xff1f; 新生代内存不够用时候发生 MGC 也叫 YGC&#xff0c;JVM 内存不够的时候发生 FGC J03、java 中垃圾收集的方法有哪些? …

史诗级长文--朴素贝叶斯

引言 朴素贝叶斯算法是有监督的学习算法&#xff0c;解决的是分类问题&#xff0c;如客户是否流失、是否值得投资、信用等级评定等多分类问题。该算法的优点在于简单易懂、学习效率高、在某些领域的分类问题中能够与决策树、神经网络相媲美。但由于该算法以自变量之间的独立&am…

质量小议37 -- 架构

架构&#xff1f;架构师&#xff1f; 听的很多&#xff0c;也见过很多所谓的架构、架构师&#xff0c;其实多数都只是软件设计师。 那什么是架构、什么是架构师&#xff1f;估计很长时间自己仍不会完全理解、也不会完全明白。 但不影响再把一些基本概念拿出来再看一…

文字转语音在线合成系统源码 附带完整的安装部署教程

现如今&#xff0c;文字转语音&#xff08;TTS&#xff09;技术逐渐成为人们获取信息的重要手段之一。然而&#xff0c;市面上的TTS工具大多需要下载安装&#xff0c;且功能较为单一&#xff0c;无法满足用户多样化的需求。因此&#xff0c;开发一款功能强大、易于部署的文字转…

分治法-快速排序

基本思路 通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另外一部分的所有数据都要小&#xff0c;然后再按此方法对这两部分数据分别进行快速排序&#xff0c;整个排序过程可以递归进行&#xff0c;以此达到整个数据变成有序序列。 缺点&…

暄桐写字计划 | 开始布局我们的2024

暄桐是一间传统美学教育教室&#xff0c;创办于2011年&#xff0c;林曦是创办人和授课老师&#xff0c;教授以书法为主的传统文化和技艺&#xff0c;皆在以书法为起点&#xff0c;亲近中国传统之美&#xff0c;以实践和所得&#xff0c;滋养当下生活。      暄桐林曦老师有…

C++11 左右值引用、移动语义

右值引用和移动语义 什么是左值&#xff1f;什么是左值引用&#xff1f; 左值是一个表示数据的表达式(如变量名或解引用的指针)&#xff0c;我们可以获取它的地址可以对它赋值&#xff0c;左值可以出现赋值符号的左边&#xff0c;右值不能出现在赋值符号左边。定义时const修饰…

智汇云舟副总裁陈虹旭受邀出席2024昆山工业元宇宙创新论坛

近日&#xff0c;由昆山市工业和信息化局、昆山经济技术开发区科技局指导&#xff0c;中国电子商会元宇宙专委会主办的2024昆山工业元宇宙创新论坛圆满举行。来自西北工业大学、中国电信股份有限公司昆山分公司、中国电信天翼云公司等单位的一百余位专家和企业领导齐聚一堂&…

【Golang】IEEE754标准二进制字符串转为浮点类型

IEEE754介绍 IEEE 754是一种标准&#xff0c;用于表示和执行浮点数运算的方法。在这个标准中&#xff0c;单精度浮点数使用32位二进制表示&#xff0c;分为三个部分&#xff1a;符号位、指数位和尾数位。 符号位(s)用一个位来表示数的正负&#xff0c;0表示正数&#xff0c;1表…

【信息安全】深度分析邮件安全及钓鱼攻击防范

本博文共计3100余字&#xff0c;预计需阅读20分钟 【邮件安全建设】 一、前言 邮件系统作为企业办公网络架构中重要的组成部分&#xff0c;同时也是业务高频使用的办公应用&#xff0c;一旦出现安全问题&#xff0c;业务将会被严重干扰甚至中断&#xff0c;本篇博客通过攻守两…

腾讯云的域名使用阿里云服务器配置

因为近期云服务器到期了&#xff0c;之前的域名已经完成了备案不想轻易回收。于是就换了个厂商&#xff0c;从腾讯云换到了阿里云。但是因为两个厂商不互通。我又不想把域名转入到阿里云。所以就开启了配置之路&#xff0c;一路磕磕绊绊。给大家整理一份顺序&#xff0c;一步到…

Qt6安装教程

由于QT在5.14版本后不再有离线安装版本&#xff0c;均需要通过在线安装 1.下载exe安装包 打开Open Source Development | Open Source License | Qt&#xff0c;往下拉&#xff0c;找到红框所示的按钮 点进去后点击Download即可 2 安装 下载完成后可得到qt-unified-windows…

vue3基础: 组件注册

组件注册 一个 Vue 组件在使用前需要先被“注册”&#xff0c;这样 Vue 才能在渲染模板时找到其对应的实现。组件注册有两种方式&#xff1a;全局注册和局部注册。 全局注册 我们可以使用 Vue 应用实例的.component()方法&#xff0c;让组件在当前 Vue 应用中全局可用。 im…

[情商-11]:人际交流的心理架构与需求层次模型

目录 前言&#xff1a; 一、心理架构 1.1 个体生理层 1.2 个体心理层 1.3 点对点人际交流层 1.4 社会网络层 1.5 社会价值层 二、人的需求层次模型 2.1 需求&#xff08;欲望&#xff09;层次模型 2.2 基因与人需求之间的关系 2.3 个体生理需求 2.4 个体的心理需求…

平衡小车——调试协议

学习目标 熟悉协议的定义掌握协议生成掌握协议解析熟悉消息队列处理协议熟悉消息队列处理业务学习内容 协议的定义 帧头 命令位 数据长度 数据位 校验位 帧尾 字节数 1 1 1 n 1 1 默认值 0x7a 待定 待定 待定 待定