【发布时间】:2016-03-29 14:04:14
【问题描述】:
我这里有一些(遗留)代码似乎在LD_LIBRARY_PATH 上调用setenv(编译时未知的值,实际上它将从命令行获取),现在我必须将它移植到视窗。我怀疑setenv只是出于历史原因,它已经没有实际效果了,我想确认一下。
所以我的方法是审查环境的所有用途,看看是否有任何人会受到LD_LIBRARY_PATH(或任何其他)的影响。所以我认为除非environ 变量或某些函数被调用,否则代码将对环境不敏感(直接、间接或在后续代码中)。
我确定的(作为候选人)的职能是:
getenv-
exec* popensystem-
dlopen和朋友们 - 仅依赖于
TZ变量的时间函数 - 依赖于语言环境且仅检索当前语言环境的函数
包含getenv 的原因很明显,因为后续代码可能取决于环境变量的值。包括exec*、popen和system是因为首先(子)程序的链接可能会受到环境的影响,而且(子)程序本身也可能依赖于环境,dlopen我认为会在LD_LIBRARY_PATH 中搜索库(同样,链接库本身可能在初始化期间或稍后访问环境)。剩下的就是因为我知道TZ 和语言环境正在标准库中的很多地方使用。
我是否错过了某些功能或其他代码可能取决于环境的情况?当然,我意识到这会受到加载的库的影响,但据我所知,只有加载的“标准”库加上libsqlite3(加上libpthread、libdl 和libm)。我猜SQLite3可能对一些环境变量很敏感,但是LD_LIBRARY_PATH是其中之一吗?
为了记录,这次程序似乎没有包含 exec* 或 dlopen,但我包含它们是因为在另一种情况下它们可能会包含在内。
【问题讨论】:
-
dlopen 让我想知道您的应用程序特定库是否是从 LD_LIBRARY_PATH 打开的。我将继续的方式是查看安装并检查 LD_LIBRARY_PATH 中使用的路径。检查应用程序指向的所有位置以及其中存在的库。
-
@Pradheep 恐怕这不可行。
LD_LIBRARY_PATH设置的值在编译时未知。 -
为什么不将其打印到任何日志中并检查路径或在 gdb 中加载程序,这样更容易并在设置时检查值
-
数字格式取决于区域设置。时间、日期、货币格式取决于区域设置。一些整理(排序)算法依赖于语言环境。字符分类取决于区域设置(数字、大写、小写等)。大部分内容都包含在标准 C 库中(货币格式化没有用于该任务的标准 C 函数,但必要的信息存储在语言环境信息中)。
-
@JonathanLeffler 是的,这就是我将它们包括在内的原因。我希望这些功能也不依赖于
LD_LIBRARY_PATH。
标签: c linux environment-variables