相关疑难解决方法(0)

什么是LD_PRELOAD技巧?

我最近在proggit看到了它的引用,并且(截至目前)它没有被解释.

我怀疑可能是它,但我不确定.

c linux environment-variables

321
推荐指数
6
解决办法
29万
查看次数

没有dlsym的Linux中的函数插入

我目前工作的一个项目,我需要跟踪的几个系统调用和低级别的功能,如使用mmap,brk,sbrk.到目前为止,我一直在使用函数插入来执行此操作:我编写了一个与我正在替换的函数同名的包装函数(mmap例如),并通过设置LD_PRELOAD环境变量将其加载到程序中.我通过我加载的指针调用实际函数dlsym.

不幸的是,我想要包装的函数之一在sbrk内部使用dlsym,因此当我尝试加载符号时程序崩溃.sbrk在Linux中不是系统调用,所以我不能简单地使用syscall它来间接调用它.

所以我的问题是,如何在不使用相同名称的包装函数的情况下调用库函数dlsym?是否有任何编译器技巧(使用gcc)让我参考原始函数?

c linux function-interposition dlsym

8
推荐指数
1
解决办法
4226
查看次数

Unix - 保护自己免受失控的内存消耗降低PC?

有关.netWindows环境的问题非常类似:

你如何保护自己免受失控的内存消耗降低PC?

这个问题是针对使用C或C++的Unix环境提出的.举个例子,考虑下面的危险小块:

#include <vector>
int main() {
  int n;
  std::vector<double> A(n);
}
Run Code Online (Sandbox Code Playgroud)

如果你很幸运,代码会抛出一个范围错误.如果你运气不好(在我的情况下,内存中的值是283740392),代码将很快使用所有可用的RAM并导致大量交换到磁盘,将操作系统更快地打磨到虚拟静止然后它就可以被杀死.当然,最终可以最终终止该进程,但通常需要几分钟才能恢复,因为所有其他正在运行的进程必须加载回内存.这不是一个问题,其答案意味着缺乏RAM,人们可能很容易给出一个失控的过程,淹没任何可用的机器.

c c++ unix linux memory-management

2
推荐指数
1
解决办法
219
查看次数