告诉链接器"respect" __attribute__((__used__))的任何方法
Any way to tell linker to "respect" __attribute__((__used__))
我正在尝试解决链接器在我的代码中删除注册的事实。 有关详细信息,请参阅此答案。
我对这个答案的问题是,--whole-archive 选项对于 1 个函数调用来说似乎是矫枉过正。我想避免我认为它会导致巨大的代码膨胀。 我发现
属性((已使用))
,但这适用于编译级别,而不是链接级别。
所以我想知道是否有一种特定的方法来告诉链接器不要删除特定的函数调用,而不是更改整个程序的链接选项。
为了澄清起见,这是我的代码:
bool dummy = (Register(), false); // Register is never called because linker dropped entire static library
所以我想知道是否有一种特定的方法可以告诉链接器不要删除特定的函数调用,而不是更改整个程序的链接选项。
你的目标实际上是告诉链接器不要删除未引用变量(dummy
)的定义,其中 初始化器 有一个函数调用,您希望确保由程序执行。
__attribute__(used)
是函数的属性,但不是变量的属性,其作用是强制编译器编译函数定义, 即使函数是静态的,并且在翻译单元中显示为未引用。在您的情况下:
bool dummy = (Register(), false);
编译器无法显示Register
未引用 - 它被调用- 所以__attribute__(used)
即使Register()
的定义位于同一翻译单元中并且是静态的,也是多余的。但无论还是 不是Register()
的定义是在这个翻译单元或其他一些翻译单元中编译的,这个呼吁Register()
如果未链接此dummy
定义,则不会在程序中链接或执行。
我假设您不想编写自定义链接器脚本,也不想修改源代码以便引用dummy
。
在这种情况下,您需要指示链接器假设对dummy
的未定义引用,通过 在其选项中传递--undefined=dummy
。这将迫使它在库中搜索dummy
的定义,并链接存档成员(和/或共享库),就像存在一样 实际上是对链接的第一个文件中dummy
的未定义引用。不会链接冗余代码, 就像--whole-archive
一样.
可以将--undefined=<symbol>
传递给链接器以获取任意数量的<symbol>
值 你喜欢。要通过gcc/g++
传递它,请使用-Wl,--undefined=<symbol>
。
把它放在它自己的部分和链接器脚本中:
KEEP(sectionname)
编辑
该行代码可以减少为将一个寄存器或变量归零
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 解决方法:'can not be used when making a shared object; recompile with -fPIC'使用Cmake。使用普通的 g++ 工作
- 修复警告"field a is not used"如果字段在配置中未使用的好方法