小编Spo*_*ood的帖子

有关覆盖C标准库函数以及如何将所有内容链接在一起的问题

我自己实现了_init,malloc,free(和其他).

在这些函数中,我使用dlfcn.h(dlopen,dlsym等)库来调用实际的标准版本.然后我把它放在一个文件中,并将它们编译为共享库(memory.so).当我希望运行一个可执行文件并让它调用我的这些函数版本时,我只需设置LD_PRELOAD = memory.so.

问题是我有许多其他的memory.c依赖的模块.这些包括一个包含扫描elf文件的函数的文件(symbols.c)和我自己实现的哈希表(hashtable.c),我用它来跟踪内存泄漏等.

我的问题是,是否有一种方法可以单独编译hashtable.c和symbols.c,因此任何malloc引用都是使用标准库解析的,而不是使用memory.c中包含的引用.我当然可以在memory.c所依赖的所有东西上使用dlfcn.h库但是如果有办法避免这种情况我会更喜欢它.

我还没有完全弄清楚链接是如何工作的,所以任何帮助都会受到赞赏.

谢谢

c linux overriding dynamic-linking static-linking

5
推荐指数
1
解决办法
4489
查看次数

覆盖C中的_init函数,它有多安全?

我正在以共享库的形式构建调试内存工具,我在运行时链接可执行文件(包括malloc系列的重写方法).为了处理我的数据结构的初始化,我简单地使用了一个条件变量.每次调用malloc时,我都会检查变量是否未设置,然后调用一个负责初始化结构的函数.现在,这适用于运行单个执行线程的程序,但如果程序包含多个线程,则会出现问题.

唯一的方法(我能想到)确保在用户生成任何线程之前进行初始化是覆盖_init ,如此链接所示.

现在这个小例子运行正确,但是当我尝试在我自己的共享库中覆盖_init时,我在尝试链接时遇到此错误:

memory2.o: In function `_init':
memory2.c(.text+0x0): multiple definition of `_init'
/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crti.o(.init+0x0): 
 first defined here
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我使用与链接中的示例完全相同的步骤,只是我的共享库还包括一组全局变量和malloc/free的覆盖版本等.

任何人都可以给我一个指出错误的指针?此外,在覆盖_init时还有什么需要考虑的因素(我猜这不是一件很正常的事情).

谢谢

c linux

5
推荐指数
1
解决办法
6004
查看次数

构建简单的shell脚本,执行作为参数传递的程序

我正在构建一个程序,它有助于C程序的内存调试.我打电话

execlp("gnome-terminal","gnome-terminal","-e",command,(char*)0);
Run Code Online (Sandbox Code Playgroud)

打开一个新的终端窗口,运行要调试的程序.我这样做是为了没有将调试信息与用户程序输出混合在一起.因为我需要在运行用户程序之前设置环境变量,所以命令var实际上是我将用户程序作为第一个arg传递给shell脚本的名称.

这是我的脚本:

#!/bin/bash

export LD_PRELOAD="./mylib.so"
$1
Run Code Online (Sandbox Code Playgroud)

这适用于没有参数的程序,但如果用户还为他的程序提供args会发生什么?

例如,我希望像这样调用我的脚本:

myScript.sh usersProgram arg1 arg2 etc
Run Code Online (Sandbox Code Playgroud)

如何在脚本中正确运行用户程序并将所有参数传递给它?

谢谢

c linux bash shell

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

标签 统计

c ×3

linux ×3

bash ×1

dynamic-linking ×1

overriding ×1

shell ×1

static-linking ×1