gpt4 book ai didi

c - 为已弃用的函数生成链接时错误

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

有没有办法用 gcc 和 GNU binutils 来标记一些函数,以便它们在使用时会在链接时产生错误?我的情况是我有一些库函数,为了与现有二进制文件兼容,我没有删除这些函数,但我想确保没有新编译的二进制文件尝试使用这些函数。我不能只使用编译时 gcc 属性,因为有问题的代码会忽略我的 header 并使用 configure 脚本检测函数的存在并自行制作原型(prototype)。我的目标是为错误的 configure 脚本生成链接时错误,以便它们停止检测函数的存在。

编辑: 一个想法.. 将使用程序集为入口点指定错误的 .type 与动态链接器兼容,但在尝试链接时生成链接错误新计划?

最佳答案

FreeBSD 9.x 使用 ttyslot() 函数做了一些非常接近您想要的事情。这个函数对 utmpx 没有意义。诀窍是这个符号只有非默认版本。因此,ld 不会找到它,但 rtld 会在运行旧二进制文件时找到版本化定义。我不知道如果一个旧的二进制文件有一个未版本化的引用会发生什么,但如果只有一个定义,这可能是明智的。

例如,

__asm__(".symver hidden_badfunc, badfunc@MYLIB_1.0");

通常也会有一个默认版本,比如

__asm__(".symver new_badfunc, badfunc@@MYLIB_1.1");

或通过与 Solaris 兼容的版本脚本,但诀窍是不添加一个。

通常,asm 指令被包装到一个宏中。

这个技巧依赖于 GNU 扩展来定义带有 .symver 汇编程序指令的符号版本,因此它可能只适用于 Linux 和 FreeBSD。 Solaris 兼容版本的脚本只能为每个符号表达一个定义。

更多信息:info gas 中的 .symver 指令,Ulrich Drepper 的“如何编写共享库”,在 http://gitorious.org/freebsd/freebsd/commit/3f59ed0d571ac62355fc2bde3edbfe9a4e722845 弃用 ttyslot() 的提交

关于c - 为已弃用的函数生成链接时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4694896/

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