加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 为什么LD_PRELOAD不会生成没有shebang的脚本?

发布时间:2020-12-14 01:07:12 所属栏目:Linux 来源:网络整理
导读:如果,当我运行脚本时,我使用LD_PRELOAD来指定要预加载的库,我发现只有当脚本有一个shebang行时才会预加载该库.例如,给定此脚本: # Not a shebangecho Hello 这个命令: LD_PRELOAD=/path/to/preload_me.so ./script.sh 该脚本在没有加载库的情况下运行,我可
如果,当我运行脚本时,我使用LD_PRELOAD来指定要预加载的库,我发现只有当脚本有一个shebang行时才会预加载该库.例如,给定此脚本:

# Not a shebang
echo Hello

这个命令:

LD_PRELOAD=/path/to/preload_me.so ./script.sh

该脚本在没有加载库的情况下运行,我可以通过其初始化代码的(非)效果进行监视.

另一方面,如果我添加一个shebang线:

#!/bin/sh
echo Hello

…当我通过相同的命令运行脚本时,库被加载.似乎确切地指定了哪个解释器;当然我也可以使用/ bin / bash或我试过的任何其他sh-family shell.

为什么有区别,有没有办法确保给定的库在给定的shell简单命令之前预加载,而不管命令是什么?

(改编自another question,其作者拒绝以这些条款表达的问题.)

解决方法

(改编自我对引用的其他问题的回答.)

必须了解LD_PRELOAD变量对操作系统或shell没有特殊意义.它有意义和影响 – 如果它有它们 – 只与动态链接器一起使用.如果未使用动态链接器,则LD_PRELOAD只是环境中的另一个变量.同样,如果动态链接器不识别该变量(例如,在OS X上).

同样重要的是要理解,当执行名称对应于不是可执行格式但包含shebang行的文件的命令时,即使它是shell本身,也会执行指定的解释器.如果解释器是ELF二进制文件,那么它将使用动态链接器.另一方面,如果没有shebang行,则bash在子shell环境中执行文件的内容,这不需要使用动态链接器;相反,shell只是分叉.其他shell可能会也可能不会这样做.

认识到存在除ELF之外的可执行格式也很重要.你不太可能在现代的基于ELF的系统上遇到这样的二进制文件,但你不应该排除这种可能性.

结论:无法确保在通过bash或用户选择的其他shell执行的任意shell命令的进程空间中预加载给定的动态库.如果您需要为任何或每个任意命令预加载这样的库,那么您需要更严格地控??制执行环境,可能是通过提供自定义shell,也可能是自定义动态链接器,并防止使用任何其他命令.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读