如果库函数类似于例如重新实现malloc
,然后有两个带有该名称的符号,一个在本地目标文件中,另一个在系统库中。当例如来自例如的函数时,使用两者中的哪一个。使用stdio
,调用malloc
(和为什么)?
答案 0 :(得分:3)
链接行为通常是:
因此,如果重新实现malloc并将其链接为目标文件,则目标文件中的版本将覆盖标准库中的版本。但是,如果新malloc链接为库,则它取决于库链接顺序。
另一种方法,考虑到gnu binutils作为作用域,重写库函数是使用--wrap参数包装函数:https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_3.html
通过使用--wrap ld选项,我们可以将两个函数链接起来,并且包装函数可以调用包装函数。
链接顺序还取决于命令行参数顺序。所以我在这里考虑将libs列在对象之后,因为一般来说,将库放在对象之前是没有意义的,因为它们的目标是提供那些所需的缺失符号。
答案 1 :(得分:-1)
一个答案是,你试图取代malloc让自己陷入了极大的麻烦。不要去那里。甚至不要考虑它。特别是如果您需要在stackoverflow上提问,请不要考虑它。
另一个答案是你正在调用未定义的行为,可能的结果是调用malloc函数会对你造成最大伤害。如果你很幸运,在开发的同时。如果您不那么幸运,那么一旦您的代码掌握在客户手中。不要这样做。
使用新名称在malloc周围编写包装器已经够糟糕了。试图取代malloc是疯狂的。