gpt4 book ai didi

linux - 为什么 LD_PRELOAD 对没有 shebang 的脚本不生效?

转载 作者:IT王子 更新时间:2023-10-29 01:15:38 26 4
gpt4 key购买 nike

如果在运行脚本时使用 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 系列 shell。

为什么会有差异,有什么方法可以确保在给定的 shell 简单命令之前预加载给定的库,而不管命令是什么?

(改编自 another question,其作者反对用这些术语提出问题。)

最佳答案

(改编 self 对引用的其他问题的回答。)

了解 LD_PRELOAD 变量对操作系统或 shell 没有特殊意义是很重要的。它只有在与动态链接器结合使用时才具有意义和效果——如果它有的话。如果未使用动态链接器,则 LD_PRELOAD 只是环境中的另一个变量。同样,如果动态链接器无法识别该变量(例如在 OS X 上)。

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

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

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

关于linux - 为什么 LD_PRELOAD 对没有 shebang 的脚本不生效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39982681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com