重载free()所以我的程序使用我的而不是系统的

时间:2013-02-06 11:21:04

标签: c linux malloc free

我需要重新编码free() func用于教育目的,它也必须命名为free()

当我重命名我的函数myfree()时,它可以完美地工作,但当我命名为free()时,程序不知道他是否需要使用我的或系统,所以程序只是Segmentation fault(core dumped)即使我不打电话给我自由(只是另一个free() func的声明似乎崩溃了)

那么如何告诉编译器使用我的而不是系统?

提前感谢你。

编辑:Linux操作系统

5 个答案:

答案 0 :(得分:6)

基本上,我可以看到三个选项

  • 在编译期间重定向它,例如使用#define作为@Mohamed建议。
  • 使用LD_PRELOAD在运行时更改它。
  • 使用malloc hooks修改现有的malloc / free。

答案 1 :(得分:6)

如果您正在使用GCC,则可以使用编译器来帮助您。编译时,请在链接行中添加:-Xlinker --wrap=free。这会将所有对free()的调用重定向为使用您必须提供的__wrap_free()。如果您想调用原始free()函数,它仍然存在,但已重命名;你可以致电__real_free()

这将捕获您链接的预编译库,宏无法做到(但LD_PRELOAD可以)。

答案 2 :(得分:1)

使用宏:强制程序使用您的myfree()函数:

#define free(X) myfree(X)

答案 3 :(得分:1)

最简单(不是最安全)的方式是#define free myfree,因此预处理器会将所有来自 free()的调用替换为 myfree()。另一种更安全的方法是创建一个名为 free()的普通函数,并且不包含库,它们还包含 free()函数。

答案 4 :(得分:1)

如果您正在寻找标准方式,我担心它不存在。重新定义标准库名称是未定义的行为。

C11,7.1.3.2:

  

...如果程序声明或定义了一个标识符      保留的上下文(7.1.4允许的除外),或定义保留的上下文       标识符作为宏名称,行为未定义。

在7.1.4中,有一个很长的解释,说明库如何定义一个与函数同名的宏以及如何绕过该宏。没有迹象表明用户如何覆盖标准库函数。

您还可以查看this question了解详情。

非标准方式当然总是可以的,你可以在其他答案中找到。