gpt4 book ai didi

c - 覆盖弱函数时如何设置编译器警告(GNU GCC)

转载 作者:太空狗 更新时间:2023-10-29 17:24:58 25 4
gpt4 key购买 nike

库函数默认设置了 weak 属性(参见 [1]),并且可能会被具有相同签名的函数意外地“覆盖”。例如 printf 在内部调用 fputc 并且我可以轻松地声明我的函数之一 int fputc(int, FILE *)。如果发生这种情况,我希望收到编译器警告。

有没有办法告诉编译器在覆盖弱函数时警告我?

[1] https://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Function-Attributes.html

最佳答案

(我猜你在 Linux 上,像往常一样编译和链接你的应用程序,特别是使用 libc.so 动态链接)

Library functions have the weak attribute set by default

这并不总是正确的;在我的系统上 fputc不是弱符号:

% nm -D /lib/x86_64-linux-gnu/libc-2.21.so|grep fputc
000000000006fdf0 T fputc
0000000000071ea0 T fputc_unlocked

(如果它很弱,T 将是一个 W,而实际上 write 很弱)

顺便说一句,重新定义你自己的fputc (或 malloc )是合法的(并且可能有用,但非常棘手),前提是它保持符合标准的语义。更普遍的弱符号预计是可重新定义的(但这很棘手)。

Is there a way to tell the compiler to warn me in case of overwriting a weak function?

(编译器无法可靠地警告您)。

因为唯一可以给你一些警告的东西不是编译器(它不知道在运行时会使用哪个特定的libc,你可以升级你的 libc.so 编译后)但是链接器,更准确地说是 dynamic linker ,即ld-linux(8) .并且警告只能在运行时可靠地给出(因为 libc.so 在构建时和运行时可能不同)。也许你想要 LD_DYNAMIC_WEAK .

如果您准备好花数周时间研究解决方案,您可以考虑使用 GCC MELT使用您自己的 MELT 扩展并自定义 最近 GCC当来自 libc 的弱符号时发出警告编译时可用(可能与运行时动态链接的 libc 不同,因此这种检查的用处有限)被重新定义。

也许您可以使用一些 LD_PRELOAD trick .

此外,如果您静态链接您的应用程序,如果您重新定义 libc,链接器可以为您提供诊断信息。功能。

另请阅读 Drepper 的 How to Write a Shared Library & 莱文的 Linkers & loaders书。

关于c - 覆盖弱函数时如何设置编译器警告(GNU GCC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35790565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com