【问题标题】:Passing arguments to a library loaded with LD_PRELOAD将参数传递给加载了 LD_PRELOAD 的库
【发布时间】:2012-07-15 13:06:00
【问题描述】:

是否可以将参数传递给我的库,该库加载了LD_PRELOAD

LD_PRELOAD=lib.so ./program

如何将参数传递给这个库?

【问题讨论】:

    标签: linux ld-preload


    【解决方案1】:

    通常我会通过使用环境变量来做到这一点。例如:

    #include <iostream>
    #include <stdlib.h>
    
    void init() __attribute__ ((constructor));
    void init() {
      std::cout << "Init: " << getenv("MYLIB") << std::endl;
    }
    

    让你这样做:

    MYLIB=hi LD_PRELOAD=./test.so /bin/echo 初始化:嗨

    this 不必在构造函数中使用(即GCC extension),但这通常是使用它们的好地方。

    我过去所做的就是使用它,并结合一个看起来像是“普通”应用程序的 shell 脚本包装器。 shell 脚本在调用exec 以加载您要插入的程序之前,获取其参数并将它们推送到您的库期望的环境变量中。它以这种方式对用户“感觉”是正确的,而不会太脆弱或侵入性。

    如果您愿意,您也可以通过阅读/proc/self/cmdline 来直接读取当前进程的命令行来执行此操作。不过,我个人会尽量避免干扰您正在使用的流程。

    【讨论】:

    • @ChercheurChercheur 很好 - 我只使用 iostreams 进行打印,您可以轻松地将其放入 stdio,除此之外没有其他特定于 C++ 的内容。 (constructor 属性在 C 中起作用,它在库加载时自动调用该函数,而不是 C++ 构造函数)
    • 拜托,我想将更多的参数传递给我的库,这可能吗?
    • @ChercheurChercheur - 使用多个环境变量或通过环境变量传入一个列表。
    • 我喜欢这样,例如:MYLIB=hi,hello LD_PRELOAD=./test.so /bin/echo ?
    • @ChercheurChercheur - 是的,这是一种方式,或者您可以使用 MYLIBARG1=val1 MYLIBARG2=val2 LD_PRELOAD=./test.so /bin/bech 或创建单个列表名称/值对:MYLIB='k1=v1:k2=v2' LD_PRELOAD ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2015-08-07
    • 2012-05-26
    • 2011-03-11
    • 2012-10-20
    • 1970-01-01
    相关资源
    最近更新 更多