问题描述
我想修改 glibc 动态链接器/加载器,以便在将共享库映射到进程之前,链接器/加载器检查该库是否已被系统中的任何其他进程加载/使用。仅当库未被任何其他进程使用/加载时,链接器/加载器才会对共享库代码执行特定操作。我知道目前链接器/加载器仅线性映射共享库并等待需求分页以物理加载库。
我尝试在动态链接器/加载器代码中使用 shell 命令 Path { path in
path.move(to: CGPoint(x: 200,y: 100))
path.addLine(to: CGPoint(x: 100,y: 300))
path.addLine(to: CGPoint(x: 300,y: 300))
path.addLine(to: CGPoint(x: 200,y: 100))
}
.frame(width: 400,height: 400,alignment: .center)
.contextMenu {
Text("hello world")
}
来实现这一点。要从动态链接器代码中调用 lsof /path/library.so
命令,我尝试过
然而,当我试图包含 stdio.h(对于 File* fp=popen("lsof /path/library.so","r")
)或 stdlib.h(对于 {{ 1}}) 头文件。您能否建议如何解决 glibc 构建错误或任何其他更好的方法来解决我的原始问题?
附加 1:谢谢@EmployedRussian。我还研究了你提到的选项。
一个可能的答案是:将它们存储在文件或数据库中。如果这是您的答案,那么解决方案就显而易见了:检查文件或数据库条目是否存在。如果是,则无需再次进行计算。
popen()
或基于文件/数据的解决方案的主要问题是:当我添加一个新的 .c 文件和该文件中的 system()
来执行文件操作(例如 lsof
),glibc 构建为我提供了以下几个函数的错误:include <stdio.h>
解决方法
然而,构建动态链接器给了我“x 符号的多重定义”错误
这是因为动态链接器非常特殊,您在动态链接器中可以执行的操作非常有限。
它很特别,因为它必须是一个独立的程序——它不能使用任何其他库(包括libc.so.6
)——它负责加载所有其他库,所以它自然不能使用它尚未加载的任何东西。
我只想在第一次物理加载库时计算一次。
这仍然是XY Problem。你打算用这个计算结果做什么?
一个可能的答案是:将它们存储在文件或数据库中。
如果这是您的答案,那么解决方案就显而易见了:检查文件或数据库条目是否存在。如果是,则无需再次进行计算。
更新:
基于 lsof 或基于文件/数据的解决方案的主要问题是:当我添加一个新的 .c 文件并在该文件中包含
这是完全相同的问题:您正在尝试使用无法在动态链接器中使用的 libc.so
部分。
如果要将计算结果存储在文件中,则需要使用可用的低级部件。使用 open()
和 write()
代替 fopen()
和 fprintf()
。
或者,在您的库或程序中执行此操作——因为您将不再关心有多少进程加载了库,因此没有理由尝试在加载器中执行此计算. (可能是有原因的,但你没有解释;所以我们又回到了 XY 问题。)