gpt4 book ai didi

linker - 限制 Solaris 上的共享库符号可见性

转载 作者:行者123 更新时间:2023-12-04 23:03:54 32 4
gpt4 key购买 nike

使用 GCC(在 Linux 上)我可以轻松地 limit visibilitysymbols in shared图书馆。

我在 Solaris (10) 上有哪些选择?

这些 GCC 功能是否也适用于 Solaris 上的 GCC(尤其是使用 Solaris 链接器/汇编器的 GCC)?

Solaris Studio C 编译器/链接器是否提供类似的属性/pragma 来控制符号的可见性(即,将默认设置为隐藏并将符号显式标记为可见)?

最佳答案

我已经在 Solaris 10 机器上测试了一些声明注释方法。令人惊讶的是,Solaris Studio C 编译器还支持 GCC-hidden-function 属性。

使用 Solaris as 配置的 GCC/ld正确实现了 visibiltiy 函数属性。

因此,使用 GCC 函数属性语法应该是最方便/便携的方法,因为它适用于 Linux/GCC、Solaris/GCC 和 Solaris/Sol-Studio。

有关将功能可见性设置为隐藏的效果的概述,请参见下表。

结果

                                                     .dynsym|.symtabSystem           Compiler     Visibility      nm     readelf           link-error                                                     elfdump―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――Linux Fedora 17  gcc-4.7.2    not specified   T      GLOBAL DEFAULT    noLinux Fedora 17  gcc-4.7.2    attr-hidden     t      -|LOCAL DEFAULT   yesSolaris 10       gcc-4.8      not specified   GLOB   GLOB D            noSolaris 10       gcc-4.8      attr-hidden     LOCL   -|LOCL H          yesSolaris 10       cc-12.3      attr-hidden     LOCL   -|LOCL H          yesSolaris 10       cc-12.3      __hidden        LOCL   -|LOCL H          yes

Methods

main.c:

#include <stdio.h>
#include <stdlib.h>

#include "power3.h"
#include "power2.h"

int main(int argc, char **argv)
{
printf("Result: %d\n", power3(atoi(argv[1])));
// should result in a link error when symbol is hidden
printf("Result: %d\n", power2(atoi(argv[1])));

return 0;
}

电源2.h:
#ifndef POWER2_H
#define POWER2_H

#if !defined(NO_HIDE)
#if defined(__GNUC__) || defined(FORCE_GCC)
__attribute__((visibility("hidden")))
#warning Using GNU-C function attribute
#elif defined(__SUNPRO_C)
__hidden
#warning Using SUNPRO-C qualifier
#endif
#endif
int
// GCC attribute also possible here
power2(int x);
#endif

电源3.h:
#ifndef POWER3_H
#define POWER3_H
int power3(int x);
#endif

电源3.c
#include "power3.h"
#include "power2.h"
int power3(int x)
{
return power2(x)*x;
}

构建命令:
cc -g   -c -o main.o main.c
cc -g -fpic -c -o power3.po power3.c
cc -g -fpic -c -o power2.po power2.c
cc -shared -fpic -o libpower.so power3.po power2.po
cc -L$PWD -Wl,-R$PWD

内省(introspection):

在 Linux 下:
nm libpower.so | grep power
readelf --dyn-sym libpower.so | grep power
readelf -s libpower.so | grep 'FUNC.*power'

在 Solaris 下:
/usr/ccs/bin/nm libpower.so | grep 'FUNC.*power'
/usr/ccs/bin/elfdump -N .dynsym libpower.so | grep 'FUNC.*power'
elfdump -N .symtab libpower.so | grep 'FUNC.*power'

系统详情:

Solaris 10 系统是 SPARC 机器,GCC 使用 as/ ld来自 /usr/ccs/bin . Solaris Studio 版本为 12.3,应用了补丁 (2013/02/04)。

来源
  • Oracle Solaris Studio 12.3 C User's Guide .第 2.2 节链接器作用域说明符,第 32 页 (__hidden)。第 2.9 节支持的属性,第 40 页 (__visibility)。
  • Solaris Studio 12.3 cc 手册页,cc(1) ( __hidden )
  • Reducing Symbol Scope with Sun Studio C/C++通过 Giri Mandalika,2005/2006
  • GCC 4.8 manual, -fvisibility paragraph

  • 全局开关

    为了完整起见,功能(和其他符号)的可见性也可能受到其他方式的影响:

    GCC-method Sol等效效果
    ―――――――――――――――――――――――――――――――――――――――――――――――― ――――――――――――――――――――――――――――――――――――
    #pragma GCC 可见性 push(hidden) - push/pop 之间的一切
    #pragma GCC visibility pop - 隐藏默认可见性
    #pragma GCC 可见性推送(默认) - ~ 默认为默认可见性
    #pragma GCC 可见性弹出 -
    -fvisibility=hidden -xldscope=hidden 设置默认可见性
    -fvisibility=default -xldscope=global 一个翻译单元

    ELF 标准还定义了内部和 protected 符号可见性 - 编译器也可以理解,但通常不太有用。

    关于linker - 限制 Solaris 上的共享库符号可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16770399/

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