【问题标题】:LD_PRELOAD, bash and printfLD_PRELOAD、bash 和 printf
【发布时间】:2011-10-27 07:44:27
【问题描述】:

我有一个共享对象,它通过 attribute 为 init 执行一些 printf()s;很简单。它只是告诉我我设置的一些变量。

当我执行LD_PRELOAD=mylib.so ./program.sh -flags 时,program.sh 由于 printfs 会吐出错误:

./program_run: line 16: cd: mylib.so: Startup
.: File name too long
./program_run: line 18: test: too many arguments

然后程序正常启动。看起来 bash 脚本在检查变量时被 printf()s 破坏了。

有解决办法吗?

【问题讨论】:

  • 打印到stderr而不是stdout。 bash 脚本中的许多命令都使用stdout,您不能只向它们添加随机文本。

标签: c linux ld-preload


【解决方案1】:

试试这个:

LD_PRELOAD=./mylib.so ./program.sh -flags

注意mylib.so前面的路径

我的经验是最好使用完整路径,例如

LD_PRELOAD=/home/source/mylib/mylib.so ./program.sh -flags

如上所述小心使用导出。

它可能会导致各种意想不到的问题。

【讨论】:

    【解决方案2】:

    试试这个改变:

    export LD_PRELOAD=mylib.so ; ./program.sh -flags
    

    你 printf() 是否使用可变参数?

    【讨论】:

    • 其中一个是,我通过define传递了一个版本号,即:#define VERSION 2.000 然后 printf("Current Version: %f", VERSION)
    • 我注释掉了共享对象中的所有 printfs()。 bash 脚本不再给出错误。试图寻找一种在不破坏 bash 功能的情况下显示此模块中的文本的方法。
    • 在mylib.so中,你定义了一个新的printf吗?我可以看看吗?
    • void altprintf(char* str, ...) { char buf[256]; va_list 参数; va_start(args, str); vsprintf(buf, str, args); va_end(args); printf(buf); }
    • 对不起,我不明白问题出在哪里
    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多