gpt4 book ai didi

c - 如何在库本身不冲突的情况下强制链接器拒绝特定库?

转载 作者:太空宇宙 更新时间:2023-11-03 23:58:14 25 4
gpt4 key购买 nike

我正在尝试在链接阶段添加健全性检查。具体来说,我有静态链接库的程序。有些程序仅限于允许链接的库集,而其他程序则不允许。例如,我有两个程序,分别来自 food.cfruits.c,我有两个库(我有源​​代码)apple.a broccoli.aapple.abroccoli.a 之间没有依赖关系。

有没有一种方法可以修改我的源代码和库的源代码,以便链接器允许我将 apple.abroccoli.a 链接到 food.c,并允许我将 apple.a 链接到 fruits.c,但是当我尝试加载 apple.abroccoli.a(或只是 broccoli.a)到 fruits.c?假设我的源代码没有#include它们链接的库中的任何 header ,因为它们是错误链接的,是删除代码遗留下来的,函数原型(prototype)是手动声明的,等等。

如果我能以某种方式标记这些库,使我的程序可以拒绝特定标记,那就太好了。

我正在使用的特定编译器没有实现 #pragma poison,这确实是我在搜索中找到的唯一有用的工具。我的直觉告诉我,我可以用弱符号做一些聪明的事情,但我不确定做什么或如何做。

我也不相信使用 #define 会对我有帮助,因为我的理解是这只会阻止我 #includeing 特定文件,但如果我'我错了,那么这也是一个很好的解决方案。

最佳答案

Some programs are limited to the set of libraries allowed to be linked while others are not.

这没有多大意义。

Is there a way I can modify my source and the libraries' source such that the linker will allow me to link both apple.a and broccoli.a into food.c, and will allow me to link apple.a into fruits.c, but will produce a linker error when I try to load apple.a and broccoli.a (or just broccoli.a) into fruits.c?

不,因为 C 语言对库一无所知。它的规范是以允许实现提供和使用它们的方式编写的,但是在 C 语言中没有办法引用库本身。它不是 C 概念。

无论如何,它没有多大意义。静态库名称没有内在意义。它们仅在标识其内容的范围内才有意义。禁止 fruits.c 链接到 broccoli.a 没有任何好处,因为它很容易变通,甚至可以想象它甚至会被意外变通构建系统维护中的错误——用于 broccoly.a 的对象额外或代替放在 apple.a 中。

此外,大多数链接器都很智能——它们在构建可执行文件时会省略未引用的函数和对象,因此在链接中包含不需要的(静态)库通常是无害的。

关于c - 如何在库本身不冲突的情况下强制链接器拒绝特定库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56029951/

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