链接到静态库中的 explicit_bzero (glibc)

Posted

技术标签:

【中文标题】链接到静态库中的 explicit_bzero (glibc)【英文标题】:link to explicit_bzero (glibc) in static library 【发布时间】:2020-10-07 09:51:36 【问题描述】:

我正在将一个 Windows C++ 项目移植到 linux。这个项目有许多静态库,这些库在一些共享库中使用过。其中一个静态库使用 SecureZeroMemory,这是一种特定于 Windows 的安全零数组的方法。为了在 linux 中使用这样的功能,我写了以下内容

#ifdef __linux__
#include <strings.h>
extern "C" void explicit_bzero(void *s, size_t n);
void SecureZeroMemory(void *s, size_t n)  explicit_bzero(s, n); 
#endif

使用它的静态库编译良好,没有错误。我的 CMakeLists.txt 文件非常标准,在添加源等之后我会这样做

add_library( myStaticLibrary STATIC $source_files )

它编译得很好。

然后,我尝试在另一个非常标准的 CMakeLists.txt 文件中编译一个使用刚才提到的共享库

add_library( mySharedLibrary  SHARED $source_files )
target_link_libraries(mySharedLibrary c myStaticLibrary  )

编译时出现错误:

myShareLibraryCode.cpp:XX undefined reference to `explicit_bzero'
ld returned 1 exit status

【问题讨论】:

为什么要单独声明?为什么不只是 #include &lt;string.h&gt; ? (看起来它是手册页中 explicit_bzero 的字符串单数)。它是 2.25 中的新功能 - 您的 GLIBC 是否足够新?那是从 2017 年开始的,但如果你使用的是 LTS Linux,你可能会有更旧的东西。 是的,问题是版本。我以为我有一个带有 explicit_bzero 的版本,因为它在我的手册页中,但手册页说它出现在 2.25 中,而我有 2.24... 【参考方案1】:

我从https://en.cppreference.com/w/cpp/string/byte/memset 发现了有关explicit_bzero 的信息。在那之后,我检查了我机器中的手册页,并且错误地假设因为我有 explicit_bzero 的手册页,所以我的 glibc 版本已经足够新了。

我正在使用 Debian 9.4 和 glibc 2.24。正如 Rup 在 cmets 中所说,手册页本身说 explicit_bzero 出现在 2.25 中。所以我的 glibc 还不够新。

要查找您的 glibc 版本,请关注 https://benohead.com/blog/2015/01/28/linux-check-glibc-version/

由于我无法更新 glibc 版本,现在我可能必须实现自己的 explicit_bzero。我好像也没有 memset_s。

【讨论】:

一些 Linux 发行版有 libbsd 库 - 你可以在那里找到 explicit_bzero

以上是关于链接到静态库中的 explicit_bzero (glibc)的主要内容,如果未能解决你的问题,请参考以下文章

静态库中的符号有时会链接到可执行文件,有时不会

静态库中的 VC++ 资源

gcc找不到静态库中的函数

如何防止静态库中的所有符号加载以及为什么在链接静态库时导出相同.o文件中的其他符号进行测试

如何使静态库中的 gcc 链接强符号覆盖弱符号?

如何让静态库中的可执行程序不调用的函数不链接进该可执行程序?(-ffunction-sections -Wl,--gc-sections)