修改 glibc 动态链接器以检查共享库是否已在另一个进程中加载

问题描述

我想修改 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 命令,我尝试过

  1. lsof
  2. system("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 文件并在该文件中包含 以执行文件操作时(例如 FILE* fp = fopen()),glibc 构建给了我错误

这是完全相同的问题:您正在尝试使用无法在动态链接器中使用的 libc.so 部分。

如果要将计算结果存储在文件中,则需要使用可用的低级部件。使用 open()write() 代替 fopen()fprintf()

或者,在您的库或程序中执行此操作——因为您将不再关心有多少进程加载了库,因此没有理由尝试在加载器中执行此计算. (可能是有原因的,但你没有解释;所以我们又回到了 XY 问题。)