如果重新实现标准库函数,那么这两个函数中的哪一个被调用?

use*_*237 6 c unix

如果malloc重新实现了像eg这样的库函数,则有两个具有该名称的符号,一个在本地目标文件中,一个在系统库中.当使用例如来自eg的函数时,stdio会使用哪两个调用malloc(以及为什么)?

oli*_*der 3

一般来说,链接行为是:

  • 包括目标文件中定义的所有符号。
  • 然后使用库中的对象解决未定义的问题。

因此,如果重新实现 malloc 并将其链接为目标文件,则目标文件中的版本将覆盖标准库中的版本。但是,如果新的 malloc 作为库链接,则取决于库链接顺序。

另一种方法,将 gnu binutils 视为范围,覆盖库函数是使用 --wrap 参数包装函数:https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ ld_3.html

通过使用 --wrap ld 选项,我们可以链接两个函数,并且包装函数将能够调用包装函数。

链接顺序还取决于命令行参数顺序。因此,我在这里考虑将库列在对象之后,因为一般来说,将库放在对象之前是没有意义的,因为它们的目标是提供这些对象所需的缺失符号。