## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# `default-visibility`

The tracking issue for this feature is: https://github.com/rust-lang/rust/issues/131090

This flag can be used to override the target's `default_visibility` setting.

This option only affects building of shared objects and should have no effect on executables.

Visibility an be set to one of three options:

- protected
- hidden
- interposable

## Hidden visibility

Using `-Zdefault-visibility=hidden` is roughly equivalent to Clang's `-fvisibility=hidden` cmdline flag. Hidden symbols will not be exported from the created shared object, so cannot be referenced from other shared objects or from executables.

## Protected visibility

Using `-Zdefault-visibility=protected` will cause rust-mangled symbols to be emitted with "protected" visibility. This signals the compiler, the linker and the runtime linker that these symbols cannot be overridden by the executable or by other shared objects earlier in the load order.

This will allow the compiler to emit direct references to symbols, which may improve performance. It also removes the need for these symbols to be resolved when a shared object built with this option is loaded.

Using protected visibility when linking with GNU ld prior to 2.40 will result in linker errors when building for Linux. Other linkers such as LLD are not affected.

## Interposable

Using `-Zdefault-visibility=interposable` will cause symbols to be emitted with "default" visibility. On platforms that support it, this makes it so that symbols can be interposed, which means that they can be overridden by symbols with the same name from the executable or by other shared objects earier in the load order.