以编程方式LD_PRELOAD
Programmatically LD_PRELOAD
目前,我有一个应用程序:
execlp(java_exec, java_args, etc, etc);
启动jar文件。
是否有办法也有它前置LD_PRELOAD="mylib.so"
?
我找不到一个方法告诉execlp
做:LD_PRELOAD="mylib.so" java -jar foo.jar
任何想法我怎么能实现这在C或c++在Linux上?
您可能应该将LD_PRELOAD=mylib.so
添加到*envp
, execlpe()
的第四个参数
该命令可以在LD_PRELOAD变量中附加用户soset LD_PRELOAD=$LD_PRELOAD;"mylib.so"
系统命令可用于在C文件
在大多数情况下,您可以在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
....
然而,putenv
和snprintf
都可能失败(或者有奇怪的行为,如果yourlibso
碰巧包含一个长的字符串)。
你可以在yourlibso
之前测试access(2)或stat(2)是否足够好。
处理每一个失败都是困难的。
参见syscalls(2)和errno(3)。
如果在编译时知道yourlibso
,事情就简单多了。参见C标准草案,如n2573,或c++标准草案,如n3337。
任何想法我怎么能实现这在C或c++在Linux上?
请记住C和c++是不同的编程语言。
相关文章:
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- /usr/bin/ld: cannot find -lc++
- 解决"ld: library not found for -ltensorflow_framework.2.3.0"
- 编译 Boost 时在 OS X 上的"ld:未知选项:-soname"
- 使 ld 忽略来自 /etc/ld.so.conf 的目录
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 试图在崇高中奔跑. 错误 已发生: 收集2.exe: 错误: ld 返回 1 退出状态
- collect2:错误:ld 返回 1 个退出状态未定义的引用
- LD:尝试编译项目时找不到架构x86_64符号
- Linux ld 如何解释 -lSomething::AnotherSomething(如 /usr/bin/ld: 找
- LD 找不到生成的函数
- C++ collect2:错误:ld 返回 1 退出状态
- OS X: ld: 找不到 -lstdc++ 的库
- Mac Snow Leopard 上的 Qt 5.3.2:ld:在架构x86_64 [clang、Objective-C
- 找不到 -llibmysqld Collect2.exe:错误:ld 返回 1 退出状态
- ld 链接器错误,未定义对主函数的引用
- 使用 Arduino 对 ATtiny10 进行编程 ( "ld.exe" 错误)
- 每次我要使用外部资源时,我都会得到:collect2。exe:错误 ld 返回 1 退出状态
- 当出现错误ld return 1退出状态时,如何编译程序