【问题标题】:Programmatically LD_PRELOAD以编程方式 LD_PRELOAD
【发布时间】:2014-08-01 09:30:34
【问题描述】:

目前,我有一个应用程序:

execlp(java_exec, java_args, etc, etc);

启动一个 jar 文件。

有没有办法让它在 LD_PRELOAD="mylib.so" 前面加上?

我找不到方法告诉execlp 去做:LD_PRELOAD="mylib.so" java -jar foo.jar

有什么想法可以在 Linux 上使用 C 或 C++ 实现这一点吗?

【问题讨论】:

标签: c++ c linux


【解决方案1】:

您可能应该将LD_PRELOAD=mylib.so 添加到*envpexeclpe() 的第四个参数。

【讨论】:

    【解决方案2】:

    此命令可用于在 LD_PRELOAD 变量中附加用户 .so set LD_PRELOAD=$LD_PRELOAD;"mylib.so" 可以使用系统命令从 C 文件中设置它

    【讨论】:

    • 请注意:从使用 exec*() 转移到 system() 可能不是一个好主意,因为在程序中使用 exec 而不是 system 是有充分理由的。
    【解决方案3】:

    在大多数情况下,您可以在execlp(3) 之前使用putenv(3)(可能与snprintf(3)asprintf(3) ...)。例如:

    char buf[64];
    memset (buf, 0, sizeof(buf));
    snprintf (buf, sizeof(buf), "LD_PRELOAD=%s", yourlibso);
    putenv(buf);
    

    然后你的execlp....

    但是,putenvsnprintf 都可能失败(或者出现奇怪的行为,如果 yourlibso 恰好包含 long 字符串)。

    您可以在 yourlibsoaccess(2)stat(2) 之前进行测试。

    处理每一次失败都很困难。

    参见syscalls(2)errno(3)

    yourlibso 在编译时已知时,事情就简单多了。请参阅 C 标准草案,例如 n2573,或 C++ 标准草案,例如 n3337

    有什么想法可以在 Linux 上使用 C 或 C++ 实现这一点吗?

    请记住,C 和 C++ 是不同的编程语言。

    【讨论】:

      猜你喜欢
      • 2021-06-17
      • 2018-06-05
      • 2017-08-22
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多