openwrt 文件依赖脚本解析

#!/usr/bin/env bash
#
# Copyright (C) 2012 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
SELF=${0##*/}

READELF="${READELF:-readelf}"
OBJCOPY="${OBJCOPY:-objcopy}"
TARGETS=$*
XARGS="${XARGS:-xargs -r}"

[ -z "$TARGETS" ] && {
  echo "$SELF: no directories / files specified"
  echo "usage: $SELF [PATH...]"
  exit 1
}

find $TARGETS -type f -a -exec file {} \; | \
  sed -n -e 's/^\(.*\):.*ELF.*\(executable\|shared object\).*,.*/\1/p' | \
  $XARGS -n1 $READELF -d | \
  awk '$2 ~ /NEEDED/ && $NF !~ /interpreter/ && $NF ~ /^\[?lib.*\.so/ { gsub(/[\[\]]/, "", $NF); print $NF }' | \
  sort -u

tmp=`mktemp $TMP_DIR/dep.XXXXXXXX`
for kmod in `find $TARGETS -type f -name \*.ko`; do
	$OBJCOPY -O binary -j .modinfo $kmod $tmp
	sed -e 's,\x00,\n,g' $tmp | \
		sed -ne '/^depends=.\+/ { s/^depends=//; s/,/.ko\n/g; s/$/.ko/p; q }'
done | sort -u
rm -f $tmp

用于查找给定目录或文件中的共享库(shared object)和内核模块(kernel module)的依赖关系。让我们一步一步来解释脚本:

  1. #!/usr/bin/env bash

    • 指定使用Bash作为解释器来执行脚本。
  2. 脚本版权信息和许可证说明:

    • 脚本版权归OpenWrt.org所有。
    • 脚本使用GNU General Public License v2进行许可,详情见 /LICENSE 文件。
  3. 定义变量和设置默认值:

    • SELF=${0##*/}:获取脚本文件名。
    • READELF="${READELF:-readelf}":定义READELF变量,如果未设置,默认值为readelf
    • OBJCOPY="${OBJCOPY:-objcopy}":定义OBJCOPY变量,如果未设置,默认值为objcopy
    • TARGETS=$*:定义TARGETS变量,用于存储要搜索的目录或文件路径。
    • XARGS="${XARGS:-xargs -r}":定义XARGS变量,如果未设置,默认值为xargs -r,其中-r选项表示当没有输入时不运行命令。
  4. 检查是否指定了搜索目标:

    • [ -z "$TARGETS" ]:检查变量TARGETS是否为空,即是否没有指定搜索目标。
    • 如果没有指定搜索目标,则输出用法说明并退出脚本。
  5. 查找 ELF 文件并提取 NEEDED 依赖:

    • find $TARGETS -type f -a -exec file {} \;:使用find命令找到指定目录或文件下的所有文件,并对每个文件执行file命令来识别文件类型。
    • sed -n -e 's/^\(.*\):.*ELF.*\(executable\|shared object\).*,.*/\1/p':使用sed命令提取ELF格式的可执行文件和共享对象(shared object)的文件路径。
    • $XARGS -n1 $READELF -d:使用xargs命令将上一步得到的文件路径传递给readelf命令来提取依赖信息。
    • awk '$2 ~ /NEEDED/ && $NF !~ /interpreter/ && $NF ~ /^\[?lib.*\.so/ { gsub(/[\[\]]/, "", $NF); print $NF }':使用awk命令过滤输出,只保留包含NEEDED的行,且文件名以"lib"开头且以".so"结尾(共享库文件)的行。它还去除了行中的方括号[],以及在共享库文件名前面的可能的问号。
  6. 查找内核模块文件并提取依赖:

    • tmp=mktemp $TMP_DIR/dep.XXXXXXXX``:创建一个临时文件用于处理内核模块。
    • for kmod in find $TARGETS -type f -name *.ko; do ... done:使用find命令查找指定目录或文件中的内核模块(以".ko"结尾的文件)。
    • $OBJCOPY -O binary -j .modinfo $kmod $tmp:使用objcopy命令提取内核模块的模块信息(.modinfo)并保存到临时文件。
    • sed -e 's,\x00,\n,g' $tmp:使用sed命令将临时文件中的空字符(\x00)替换为换行符,以便处理依赖关系。
    • sed -ne '/^depends=.\+/ { s/^depends=//; s/,/.ko\n/g; s/$/.ko/p; q }':使用sed命令提取依赖信息。它在匹配行中找到以depends=开头的依赖列表,并将逗号,替换为换行符,最后输出.ko结尾的依赖文件名。
    • sort -u:对输出进行排序并去重。
  7. 删除临时文件:rm -f $tmp

综上所述,该脚本查找指定目录或文件中的 ELF 可执行文件和共享对象文件,并提取它们的依赖项。同时,它还查找指定目录或文件中的内核模块文件,并提取它们的依赖项。最后,将所有提取到的依赖项输出到标准输出,并去重排序。这个脚本可能用于在构建系统中解析软件包之间的依赖关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenWrt中,开机启动脚本位于/etc/init.d目录下。这些脚本通常是以S开头或K开头,并且有一个数字来表示执行顺序。以S开头的脚本在系统启动时执行,而以K开头的脚本在系统关机时执行。数字越小,脚本执行的优先级越高。 这些启动脚本可以通过enable和disable参数来创建或删除它们的符号链接。当使用enable参数调用启动脚本时,系统会在/etc/rc.d/目录下创建一个以S开头的符号链接,而使用disable参数则会删除该链接。 在启动脚本中,通过定义start()函数来指定在系统启动时要执行的命令,而通过定义stop()函数来指定在系统关机时要执行的命令。在start()函数中可以编写启动应用程序的命令,而在stop()函数中可以编写关闭应用程序的命令。 此外,/etc/rc.d/目录下的脚本还可以调用其他脚本来执行特定的任务。例如,S10boot脚本会调用uci_apply_defaults函数来执行开机时的UCI配置初始化工作,而S20network脚本会使用/sbin/netifd守护进程根据/etc/config/network配置文件来进行网络配置。 综上所述,OpenWrt的开机启动脚本位于/etc/init.d目录下,用于在系统启动或关机时执行特定的任务。通过定义start()和stop()函数可以指定在启动和关闭过程中要执行的命令。同时,通过在/etc/rc.d/目录下创建符号链接可以控制脚本的启用和禁用。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值