在Ubuntu Linux 16.04桌面上运行的C#可执行文件在哪里使用DLLImport共享对象在运行时寻找它们的源代码?

坦率

在Ubuntu Linux 16.04 Lenovo Thinkstation桌面上运行的C#可执行文件在哪里使用DLLImport的共享对象(so)在运行时查找共享对象的源代码?即使共享库libxyz.so与C#可执行文件的子目录位于同一子目录中,我也发现有必要导出LD_LIBRARY_PATH以确保正确的C#可执行程序行为。为什么会这样呢?

我们注意到,在安装许多第三方Linux软件产品期间,安装程序或脚本设法在/ usr / libx86_64-linux-gnu子目录中找到libc.so.6,而无需客户指定包含该子目录的LD_LIBRARY_PATH。为什么会这样?

另外,如果我们希望以点的形式运行C#可执行文件并单击mono-service,那么如何在不重新打开Ubuntu Linux 16.04终端的情况下全局指定LD_LIBRARY_PATH,直到计算机重新启动?有没有比将LD_LIBRARY_PATH作为envp参数传递给execle更优雅的方法?

罗伊马

我会尽力为您回答这个问题的所有三个部分

[为什么]必须导出LD_LIBRARY_PATH以确保正确的C#可执行程序行为

安装程序或脚本设法在/ usr / libx86_64-linux-gnu子目录中找到libc.so.6,而无需客户指定LD_LIBRARY_PATH

链接库是从一组已知的位置引用的。通常,这些是系统目录,以便特权代码可以安全地使用它们(用户不能覆盖它们)。

了解这一点后,您将意识到已知位置集不能包含.您可以通过检查文本文件来查看一组已知位置/etc/ld.so.conf如果您对其进行编辑,则必须运行ldconfig以更新其对应的二进制数据库。

可以通过使用的实例为每个应用程序扩展一组已知位置LD_LIBRARY_PATH,该实例使用冒号分隔的目录列表进行搜索。如果您使用它,内核将放弃程序的所有特权-例如,您不能使用它来作弊passwdsudo

daccess-ods.un.org daccess-ods.un.org在计算机重新启动之前,我们如何全局指定LD_LIBRARY_PATH [...]有没有比将LD_LIBRARY_PATH作为execp的envp参数更优雅的方法?

设置它在全球将是一个非常糟糕的主意,因为它会打破sudopasswd以及其他特权程序。不过,我不明白为什么不能LD_LIBRARY_PATH在每个应用程序的shell脚本中进行设置您不需要将其作为“终端程序”启动,因为它不会对终端产生任何重要影响

#!/bin/bash
#
APP_DIR=/path/to/application
APP_DIR_LIB="$APP_DIR/lib"
APP_DIR_EXE="$APP_DIR/someprogram.exe"

export LD_LIBRARY_PATH="$APP_LIB_DIR"${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
exec "$APP_DIR_EXE" "$@"

echo "Ooops" >&2
exit 1

我已经使用过,"$@"以便传递给脚本的所有参数都应用于可执行文件本身。

我不知道您将如何启动或停止单声道服务,因此我无法为您提供具体的服务。如果您更新问题,我会在这里添加任何内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档