【问题标题】:selectively disable dead code elimination in a library有选择地禁用库中的死代码消除
【发布时间】:2020-02-07 07:43:57
【问题描述】:

我有很多 cpp 文件,其中一些具有自订阅事件的功能。不幸的是,如果没有明显的函数调用,大多数链接器将从编译单元中删除所有符号。有没有办法强制链接这些订阅功能?我不想完全禁用死代码剥离,因为我可能会错过很多其他翻译单元的机会。

订阅者.cpp:

Event &someEvent();

void doSomething()
{
  printf("doing something\n");
}

class Initializer
{
  public: Initializer()
  {
    // I need this function to be kept
    someEvent().subscribe(&doSomething);
  }
} initializer;

Main.cpp:

Event &someEvent();

int main()
{
  someEvent().dispatch();
}

谢谢

编辑:

这是一个复制版本:https://github.com/malytomas/deadCodeElimination (感谢 Ayjay 的帮助,即使他/她的示例没有重现问题。)

问题只发生在库中。 (感谢 Employed Russian 提出这个问题。)

【问题讨论】:

  • “大多数链接器” - 第一个列表中的特定代码被错误地...“消除”了?此外,链接器不会从“编译单元”中删除代码;他们将其从链接目标中剥离。只有在确保它没有被引用之后。 doSomething 在第一个清单中明确提到,那么您实际上在谈论哪个代码?一个真实的 minimal reproducible example 可能会大大有助于放大您的问题。
  • 在玩弄了这段代码以使其实际编译之后(你为什么不这样做?),它似乎工作正常。 Godbolt。您的实际问题是什么?您能否链接一个实际演示该问题的代码示例?
  • 我已经创建了实际工作的示例。它需要多个文件(显然还需要一个库),这就是我一开始没有编写它的原因。很抱歉让您感到困惑。

标签: c++ visual-c++ linker g++ dead-code


【解决方案1】:

不幸的是,如果没有明显的函数调用,大多数链接器都会从编译单元中删除所有符号。

你错了:一个可以这样做的链接器将是一个损坏的链接器。链接器垃圾收集注册全局构造函数或析构函数的代码。

最有可能发生的情况是,您的目标文件甚至没有被选择到链接中(不是从存档库中提取)。这个post 很好地解释了许多链接器用来确定选择什么和不选择什么的算法。

更新:

现在我们可以看到重现,您的实际问题与死代码消除无关。正如我所怀疑的,subscriber.o 根本没有从libsubscriber.a 中提取出来,因为链接器找不到这样做的理由。

这是实际的链接命令:

/usr/bin/c++ -rdynamic CMakeFiles/main.dir/main.cpp.o  -o main libsubscriber.a

这是你想要的命令:

/usr/bin/c++ -rdynamic CMakeFiles/main.dir/main.cpp.o  -o main \
  -Wl,--whole-archive libsubscriber.a -Wl,--nowhole-archive

我不知道如何用 CMake 实现这一点,抱歉。

或者,您还可以通过以下方式达到预期效果:

/usr/bin/c++ -rdynamic CMakeFiles/main.dir/main.cpp.o  -o main \
 -u _Z19forceLinkSubscriberv libsubscriber.a

【讨论】:

  • 谢谢,我会尽快仔细阅读文章。问题仍然存在:我能做些什么呢?我知道我可以添加虚拟函数(如新的链接复制构建中所示),但我更喜欢不那么麻烦的东西。像函数属性或类似的。
  • 感谢您的更新。在您昨天指出之前,我不知道差异。我真的希望有某种方法可以标记对象以总是从代码中提取它。我想我将不得不坚持我所拥有的。这很不方便,但修改链接命令(尤其是来自 cmake 的)会更糟。谢谢:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多