从私有函数中删除 static 会破坏 ABI 兼容性吗?

Will removing `static` from a private function break ABI compatibility?

假设您正在处理需要保持 ABI 兼容性的库的源代码。这个库有一个 .c 文件,它定义了一个 static 函数,如下所示:

static int
wl_message_count_arrays(const struct wl_message *message)
{
    // ...
}

此函数未在任何导出的 header 中公开,但我想在私有 header 中公开它。这样做,函数不能被标记为static。删除函数签名的 static 修饰符会改变 ABI 吗?

我觉得有几点需要考虑:

  • 它会改变 ABI 吗?

    是的,因为现在有一个新的 public 符号。就 ABI 而言,添加新函数和从现有函数中删除 static 没有区别。

  • 它会破坏兼容性吗?

    它肯定是相反的:链接到使用新符号的新版本库的程序将不会 运行 与旧版本的库链接。

  • 好的,但是旧库用户想要升级怎么办?

    在这种情况下,他们可能会自己定义同名符号,从而导致与新库发生冲突。从技术上讲,这是一个重大变化。

    但如果符号是 "namespaced"(例如,如果库中的所有名称都使用 foo_ 前缀,而新符号也使用),那么我会在道德上考虑这种变化 non-breaking 并且新的 ABI 与旧的 ABI 兼容。