在 OS-X 上隐藏或屏蔽进程的目录

在 OS-X 上隐藏或屏蔽进程的目录

是否有一种方法可以让进程(无root)隐藏或挂载到文件系统的路径上?它不应该影响实际的文件系统,只影响进程本身及其子进程?

有点奇怪的用例,但我需要在 OSX 构建服务器上构建一些东西,就好像它是普通的 OSX 机器一样。然而不幸的是,安装了一些库,/usr/local/{include,lib}这些库搞乱了构建,而且我在机器上没有 root 权限。所以我想/usr/local在跑步时暂时隐藏起来configuremake

我没有写权限,/usr/local所以我无法实际修改它。

答案1

不,没有直接的方法可以做到这一点。你可以用chflags hidden它来隐藏东西发现者,但这不会影响命令行。

解决方案取决于配置脚本。它可能只需查看PATH即可注意到/usr/local,但更有可能的是它会有一个硬编码的目录列表可供查看 - 包括/usr/local.要解决前者(PATH基于 -),您可以调整您的路径。对于后者,唯一有效的方法就是修改configure脚本。

您会看到硬编码列表的原因是附加组件可能不会使用与系统其他部分相同的搜索路径。例如,各种 BSD 端口可以使用/usr/pkg/usr/local等,并且部分地依赖打包程序在其构建脚本中设置这些路径名。但是,不是作为 ports 系统的一部分构建的程序必须在这些地方寻找东西,以便在很少用户关注的情况下构建。

如果您想覆盖 OSX 的默认搜索路径,请从ld手册页开始,其中显示

搜索路径
ld维护一个目录列表来搜索要使用的库或框架。这默认库搜索路径是/usr/lib然后/usr/local/lib。这-L选项将添加新的库搜索路径。默认框架搜索路径是/Library/Frameworks然后/System/Library/Frameworks。 (注:之前,/Network/Library/Frameworks位于默认路径的末尾。如果您需要该功能,则需要显式添加 -F/Network/Library/Frameworks)。这-F选项将添加新的框架搜索路径。这-Z选项将消除标准搜索路径。这 -syslibroot选项将为所有搜索路径添加前缀。

您可以ld通过在选项前面加上前缀-Wl(并在需要空格的地方使用逗号)来传递选项。为了您的目的,您将编写一个脚本

  • 用于-Z删除搜索路径,以及
  • 添加回您需要使用的部分-L

clang选项-v显示了详细信息编译器前端,并传递-vld,例如,使用-Wl,-v显示链接器的细节。

像这样的事情,例如:

#!/bin/sh
clang -Wl,-Z -L/usr/lib -F/Library/Frameworks -F/System/Library/Frameworks "$@"

它没有记录在clang手册中,但快速检查表明它将-Z向链接器传递一个简单的选项。另一方面,clang文档选项(主要用于 gcc 兼容性)是否会抑制对不同类别的包含目录的搜索:

   -nostdinc
          Do not  search  the  standard  system  directories  or  compiler
          builtin directories for include files.

   -nostdlibinc
          Do not search the standard system directories for include files,
          but do search compiler builtin include directories.

   -nobuiltininc
          Do not search clang's builtin directory for include files.

它没有显示包含文件的搜索路径的选项,但您可以通过运行预处理器来推断。

一旦你让脚本工作,然后运行脚本configure,你可以设置CC该脚本的名称,例如,

./configure CC=cc-system

我这样做已经有一段时间了,但不需要这种特定的组合(请参阅编译器包装器)。

答案2

假设这些进程正在合作(即它们不会故意尝试解决隐藏问题)并且它们是动态链接的可执行文件,您可以使用DYLD_PRELOAD(这是 OSX 名称,大多数其他 Unix 变体都称之为LD_PRELOAD)来加载一个包含文件查找函数并伪造一些结果的库。

这里是一个代码示例,它几乎可以完成您想要的操作。根据您运行的程序访问您不希望它们看到的文件的方式,您可能必须覆盖其他函数,可能是openaccess

答案3

因此,您不想真正隐藏某些目录,您只是想确保您的configure脚本在该目录中找不到某些文件。

完成此操作的最简单方法可能是configure.ac在编辑器中打开并编辑它,以便它不会搜索 中的包含文件或库/usr/local,然后重新生成configure脚本。或者,您也可以configure直接编辑,因为它毕竟只是一个 shell 脚本。然而,这会稍微复杂一些,因为脚本是生成的。

答案4

根据构建所选择的库以及configure脚本的设置方式,您可以通过告诉configure不要使用提供该库的“外部包”或在其他路径中查找它来禁用它的使用。

这样做的方法configure通常是说

$ ./configure --without-PACKAGE

禁用该包的使用,或者,

$ ./configure --with-PACKAGE=PATH

指向安装它的另一个路径,其中PACKAGE是提供库的“外部包”,PATH是安装包的前缀路径。

另一种解决方案是设置一个与目标机器配置相同的虚拟机并在那里构建。

相关内容