Re: Shared library symbol visibility

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/30/2013 09:56 AM, Noah Watkins wrote:
It looks like we may be outgrowing the use of export-symbols-regex and
friends to control symbol visibility for published shared libraries.
On Linux, ld seems to be quite content linking against hidden symbols,
but at least on OSX with Clang it seems the visibility is strictly
enforced.

For instance, librados exports only the prefix "rados_", but that
regex hides everything in the C++ interface. Unfortunately,
export-symbols-regex doesn't play nice with C++ name mangling.

Large projects that I've been looking at for examples (chromium, v8,
Java) seem to use a different approach based on the compiler flag
"-fvisibility=hidden" that hides everything by default and uses
explicit exporting.

These are the basics, and there are variants that work on Windows for
DLL's as well with more macro magic.

#define CEPH_EXPORT __attribute__((__visibility__("default")))

   class CEPH_EXPORT ObjectOperation {
     public:
       ObjectOperation();
       virtual ~ObjectOperation();
       ...

There is a sample branch up with this approach at:

    http://github.com/ceph/ceph port/visibility

More info

https://www.gnu.org/software/gnulib/manual/html_node/Exported-Symbols-of-Shared-Libraries.html
http://gcc.gnu.org/wiki/Visibility

This is great! It serves as a good reminder when you're touching public
interfaces as well. It may be annoying to add it to everything
initially, but it seems quite nice once it's in place!

Josh
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux