gpt4 book ai didi

c++ - Linux 上的共享库和链接 (elf)

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:28 26 4
gpt4 key购买 nike

我已阅读 Creating Library with backward compatible ABI that uses Boost 上的帖子我现在正试图了解我应该如何链接我的共享库以保持稳定的 ABI,并避免干扰符号的问题。

我创建了以下简单的测试项目:

cat <<EOF > a.c
#define ABI __attribute__((visibility("default")))

int common();
int ABI a() { return common() + 1; }
EOF

cat <<EOF > b.c
#define ABI __attribute__((visibility("default")))

int common();
int ABI b() { return common() + 2; }
EOF

cat <<EOF > common_v1.c
int common() { return 1; }
EOF

cat <<EOF > common_v2.c
int common() { return 2; }
EOF

cat <<EOF > test.c
#include <assert.h>

int a();
int b();

int main(int argc, const char *argv[])
{
assert( a() + b() == 6 );
return 0;
}
EOF

cat <<EOF > CMakeLists.txt
cmake_minimum_required(VERSION 2.8)

project(TEST)

add_library(common_v1 STATIC common_v1.c)
add_library(common_v2 STATIC common_v2.c)

SET_SOURCE_FILES_PROPERTIES( a.c b.c COMPILE_FLAGS -fvisibility=hidden )
add_library(a SHARED a.c)
target_link_libraries(a common_v1)

add_library(b SHARED b.c)
target_link_libraries(b common_v2)

add_executable(test test.c)
target_link_libraries(test a b)
EOF

库 common_v1 和 common_v2 应该模拟库 a 和 b 的外部依赖(如 Boost)。因为 common_v1 和 common_v2 被视为外部库,所以我宁愿不更改它们的构建系统(也不会更改它们编译时使用的标志)。

上面的项目,编译正常,但它不工作!执行测试应用程序时,它会跳转到 assert 语句。

这让我相信在 liba 和 libb 中使用了相同的 common 定义。为什么会这样,我做错了什么?

最佳答案

您可以使用 --retain-symbols-file 修复您的测试程序ld 的选项在创建您的 a 时和 b库并仅保留 a()b()符号,所以 common()这些库不会导出符号(因此一个库不会尝试使用另一个库的 common() 符号):

  --retain-symbols-file filename        Retain only the symbols listed in the file filename, discarding all        others. filename is simply a flat file, with one symbol name per line.

您也可以使用 --version-script选项:

  --version-script=version-scriptfile        Specify the name of a version script to the linker.

哪里version-scriptfile是以下内容:

  FOO {    global: a; b; # symbols to be exported    local: *;     # hide others  };

相关主题:

关于c++ - Linux 上的共享库和链接 (elf),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8411627/

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