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,一经查实,立即删除!

相关文章

SQL Server 配置远程连接

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

ubuntu安装node

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

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

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

面试宝典之JVM优化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Qt6安装教程

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

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

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

部署Tomcat

Tomcat简介 名称由来:Tomcat最初是由 Sun的软件构架师詹姆斯邓肯戴维森开发的,后来他帮助将其变 为开源项目,并由Sun贡献给Apache软件基金会,由于大部分开源项目OReilly都会出一本相关的 书,并且将其封面设计成某个动物…

计算机毕业设计 基于Java的综合小区管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

“一键转换PNG至BMP:轻松批量处理,高效优化图片管理“

在数字世界中,图片格式的转换是日常工作中不可或缺的一部分。你是否经常遇到需要将PNG格式的图片转换为BMP格式的需求?是否在处理大量图片时,希望能够实现一键批量转换,提高工作效率? 首先,我们进入首助编…

Dell 机架式服务器 - 高级定制

Dell 机架式服务器 - 高级定制 1. Dell Technologies2.1. Servers & Storage (服务器及存储) -> Servers2.2. Rack Servers (机架式服务器)2.3. Shop2.4. PowerEdge Rack Servers (PowerEdge 机架式服务器)2.5. PowerEdge R760 Rack Server (PowerEdge R760 机架式服务器…

本地通过代码安装禅道系统,解决nginx“504 Gateway Time-out”错误

第一步:下载源码 在官网下载代码包: 下载地址:源码包下载我下载的是PHP7.0版,大家下载随自己喜好下载第二步:安装 安装环境:php(7.0)mysql(8.0)nginx(1.21.1) 由于我在本地安装了BT宝塔面板,所以我以宝塔面板安装演示为例: 创建成功后去 C:\Windows\Syst…

【DDR】基于Verilog的DDR控制器的简单实现(一)——初始化

在FPGA中,大规模数据的存储常常会用到DDR。为了方便用户使用,Xilinx提供了DDR MIG IP核,用户能够通过AXI接口进行DDR的读写访问,然而MIG内部自动实现了许多环节,不利于用户深入理解DDR的底层逻辑。 本文以美光(Micro…