- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
如果在运行脚本时使用 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/
我希望在通过 POST 方法发送数据后文本框消失。但我无法让 Javascript 工作。页面不断重新加载,因此文本框始终存在。 function puff() { if (document.get
我无法让 expand_aliases 在 bash 中生效。我尝试了很多不同的方法,但没有任何效果。 这是一个简单的测试用例: /bin/bash -c 'shopt -s expand_alias
我正在尝试查找 #include 位于 extern C block 内的所有位置。是否可以使用预处理器进行检查?我想在我的头文件中添加类似这样的内容: #ifdef EXTERN_C_IS_IN_E
我们扩展了 UILabel,以便能够为我们应用程序中给定标签类型的所有用途应用标准字体和颜色。例如。 @interface UILabelHeadingBold : UILabel @end 在我们的
案例1 我们正在尝试将自定义样式应用于渲染的 vuetify 元素: .input-group__input { background: red; } 但是没有任何变化。 案
我正在使用 symfony 1.4 和 sfGuardDoctrinePlugin,我已经安装并设置好了,但我遇到以下问题: 如果我以管理员身份登录并更新用户的权限,该用户必须注销然后重新登录才能获得
getElementsByTagName() 有 2 个很棒的特性:速度快且实时。但是,如果我想获得 p strong 怎么办。当然,我可以再次使用 getElementsByTagName() 优化
我有三个文件: spark_mock_dependency.py 提供了一个user() 方法来读取/etc/user, spark_mock.py 用于创建一个 Env 类,它使用 user() 方
我从 samples/bpf/pare_simple.c(来自 Linux 内核树)编译了 BPF 示例,做了非常简单的更改: SEC("simple") int handle_ingress(str
我有一个基本的树结构。容器可以水平滚动。我在所有 上都有正确的填充元素。但是,正确的填充没有生效。我该如何修复它才能生效? ul { height: 100%; margin: 0; p
我目前在使用 Ruby on Rails 上的 Assets 管道时遇到了一些问题。 我正在使用电子商务解决方案 (Spree),在文档中,文档中有这个: [...] you can improve
在我们非常庞大且非常复杂的 AngularJS 应用程序中,我注意到(偶然!)我的主模块设置中有这样一行... application.run(function($rootScope) { w
我发现重写getResources()后app第一次运行的activity也会对后面运行的activity生效,前提是你的手机字体特别大。 例如:执行以下步骤 将手机字体设置为巨无霸 创建两个名为 A
我正在尝试使用 KVO 来观察在我的页面 View Controller 的子内容 View Controller 的 ScrollView 中使用拖动时的更新变化,但是当应用程序启动时,它崩溃了说:
我是一名优秀的程序员,十分优秀!