- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 GCC(在 Linux 上)我可以轻松地 limit visibility的 symbols 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
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;
}
#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
#ifndef POWER3_H
#define POWER3_H
int power3(int x);
#endif
#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
nm libpower.so | grep power
readelf --dyn-sym libpower.so | grep power
readelf -s libpower.so | grep 'FUNC.*power'
/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'
as
/
ld
来自
/usr/ccs/bin
. Solaris Studio 版本为 12.3,应用了补丁 (2013/02/04)。
__hidden
)。第 2.9 节支持的属性,第 40 页 (__visibility
)。 cc(1)
( __hidden
) 关于linker - 限制 Solaris 上的共享库符号可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16770399/
Solaris 中的“\t”或“\r\t”是制表符吗?换行字符序列\n 或\r\n ? 谢谢 最佳答案 \t = 制表符 \r = 回车 \n =换行 Solaris 标准行分隔符是\n 关于sola
我需要找出 Solaris 盒子的硬盘驱动器名称,但我不清楚设备名称是什么。在 Linux 上,它类似于 /dev/hda 或 /dev/sda,但在 Solaris 上,我对分区和设备的名称有点迷失
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我使用 mmap(只是尝试了解 mmap 的工作原理)来分配 96k 匿名内存,但看起来它将 96k 分成了 64k 和 32k。但是当分配960k时,它只分配一个大小为960k的chunk。什么时候
可用于 OpenSolaris 的源代码对于了解 Solaris 的内部结构(以及 dtrace 和 mdb)非常有用。然而,据我所知,没有办法准确地找出 OpenSolaris 源代码与作为 Sol
我在configure.ac中声明了一个变量: MY_VERSION="0:0:0" AC_SUBST(MY_VERSION) AC_MSG_NOTICE([$MY_VERSION]) 变量的值在./
我试过使用 /string1\|string2 没用。 尝试过 /字符串1|字符串2 没用。 有什么帮助吗? 最佳答案 您必须将“交替”放在\(...\) 的“分组”中。这应该有效: /\(strin
Solaris 中的某些命令(如 iostat)使用磁盘名称(如 sd0 或 sdd2)报告磁盘相关信息。是否有一致的方法将这些名称映射回标准/dev/dsk/c?t?d?s? Solaris 中的磁
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭11 年前。 Improve th
如何在solaris 11中生成UUID? 在 Solaris 10 中,我使用 makeuuid 命令生成。 我在 solaris 11 中找不到它,而它根据 oracle 文档存在 https:/
我正在将 Solaris 10 应用程序迁移到 RHEL。该应用程序使用某些特定于 Solaris 的函数,我在 Linux 上找不到等效函数。 void double_to_decimal(doub
在 Solaris 上,我似乎需要单引号 'a match the beginning of line' 表达式: > sh $ echo offset 0.000000 2>&1 | grep
我正在尝试运行一个旧的 Solaris SPARC 应用程序。 我从this question中学到了x86 Solaris 不会削减它。我最近了解到 VM virtualbox 不能模拟 SPARC
我正在将我们的应用程序从solaris sparc 移植到solaris x86,并且我遇到了这两种体系结构之间的结构大小差异。例如;我有一个类似的结构 typedef struct mystruct
在 linx CShell 上工作时,您可以选择按向上/向下箭头来选择最后键入的命令或命令缓冲区。这甚至适用于 Windows。 但是,在我最近切换到的 Solaris 上工作时,这不起作用。我猜 s
在 Solaris 上,我似乎需要单引号 'a match the beginning of line' 表达式: > sh $ echo offset 0.000000 2>&1 | grep
我正在尝试运行一个旧的 Solaris SPARC 应用程序。 我从this question中学到了x86 Solaris 不会削减它。我最近了解到 VM virtualbox 不能模拟 SPARC
Qt 页面没有列出用于 Solaris 的预编译 Qt 5 包。四处搜索,它似乎也没有包含在流行的软件包存储库 OpenCSW 中。一些谷歌搜索表明在 Solaris 下构建 Qt 5 涉及在 Sol
全部, 我们正在 WebLogic 服务器 9.2 MP2 上运行 J2EE 应用程序,并在 Solaris 10 上使用 jrockit 64 位 JVM (27.3.1)。 我们调用userunt
我正在尝试从 http://ftp.gnu.org/gnu/binutils 构建 binutils 2.21.1a在 Solaris sun4u sparc SunOS 5.10 上。我正在使用 g
我是一名优秀的程序员,十分优秀!