相关疑难解决方法(0)

gcc的"-Wl,option"和"-Xlinker option"语法之间的任何区别

我一直在查看一些配置文件,我已经看到两者都被使用(虽然在不同的架构上).如果你在linux盒子上使用gcc,那么将选项传递给链接器的两种语法之间有什么区别吗?阅读gcc手册,就我所知,它们几乎完全相同.

c linker gcc ld

29
推荐指数
1
解决办法
2万
查看次数

共享库隐藏符号在 macOS 上仍然可见,但在 Linux 上不可见

我正在使用 gcc 和 clang 尝试共享库中的符号可见性(就这个问题而言,两者似乎表现出相同的行为)。这个问题的动机是确保特定符号永远不会在共享库中暴露。想象一个具有敏感名称的函数,该名称必须保密,并且该函数在共享库内部使用。在 Linux 上一切都按照我的预期进行,但在 macOS 上我似乎无法确保符号确实完全隐藏。

我已将问题简化为以下最小演示程序。真实的场景会使用诸如-fvisibility等的标志,而不是显式地在每个符号上放置属性,但我这样做只是为了最小化示例(即不关注样式,只关注行为)。

足球俱乐部

__attribute__ ((visibility("default"))) int func(int v)
{
    return v + 14;
}


__attribute__ ((visibility("hidden"))) double some_other_func()
{
    return 1.23456;
}
Run Code Online (Sandbox Code Playgroud)

使用以下命令行进行编译(针对 macOS 显示,用于libf.soLinux):

gcc -shared -fPIC -o libf.dylib f.c
Run Code Online (Sandbox Code Playgroud)

我希望该some_other_func()函数被隐藏,但使用nm我可以确认它仍然作为全局/外部符号出现在文本部分中(大写T而不是小写t,后者是可以删除的本地符号):

# macOS
> nm -DC lib.dylib
0000000000000f80 T func
0000000000000fa0 T some_other_func
                 U dyld_stub_binder
Run Code Online (Sandbox Code Playgroud)

但在 Linux 上,我们得到了我们所期望的结果,但some_other_func()没有出现:

# Linux
> nm -DC libf.so
0000000000201020 B __bss_start …
Run Code Online (Sandbox Code Playgroud)

c linux macos gcc visibility

5
推荐指数
0
解决办法
744
查看次数

标签 统计

c ×2

gcc ×2

ld ×1

linker ×1

linux ×1

macos ×1

visibility ×1