Oracle Solaris Studio 12.2:C++ 用户指南

A.2.136.1 值

v 必须是下列值之一:

表 A–36 -xldscope

值 

含义  

global

全局链接程序作用域是限制最少的链接程序作用域。对符号的所有引用都绑定到定义符号的第一个动态装入模块中的定义。该链接程序作用域是外部符号的当前链接程序作用域。 

symbolic

符号链接程序作用域比全局链接程序作用域具有更多的限制。将对链接的动态装入模块内符号的所有引用绑定到模块内定义的符号。在模块外部,符号也显示为全局符号。该链接程序作用域对应于链接程序选项 -Bsymbolic。尽管不能将 -Bsymbolic 与 C++ 库一起使用,但可以使用 -xldscope=symbolic,而不会引起问题。有关链接程序的更多信息,请参见 ld(1)。

hidden

隐藏链接程序作用域具有比符号和全局链接程序作用域更高的限制。将动态装入模块内的所有引用绑定到该模块内的定义。符号在模块外部是不可视的。 

缺省值

如果未指定 -xldscope,编译器将假定 -xldscope=global。如果指定了没有任何值的 -xldscope,则编译器就会发出错误。出现最合适的实例之前,该选项的多重实例在命令行上会互相覆盖。

警告

如果要使客户端覆盖库中的函数,就必须确保该库生成期间未以内联方式生成该函数。如果使用 -xinline 指定函数名、在可以自动进行内联的 -xO4 或更高优化级别进行编译、使用内联说明符或者要使用跨文件优化,编译器会内联函数。

例如,假定库 ABC 具有缺省的分配器函数,该函数可用于库的客户端,也可在库的内部使用:

void* ABC_allocator(size_t size) { return malloc(size); }

如果在 -xO4 或更高级别生成库,则编译器将内联库组件中出现的对 ABC_allocator 的调用。如果库的客户端要用定制的版本替换 ABC_allocator,则在调用 ABC_allocator 的库组件中不能进行该替换。最终程序将包括函数的不同版本。

生成库时,用 __hidden__symbolic 说明符声明的库函数可以内联生成。假定这些库函数不被客户端覆盖。请参见4.1 链接程序作用域

__global 说明符声明的库函数不应内联声明,并且应该使用 -xinline 编译器选项来防止内联。

另请参见

-xinline-xO-xcrossfile