diff options
author | Kaleb S. KEITHLEY <kkeithle@redhat.com> | 2014-11-18 11:08:16 -0500 |
---|---|---|
committer | Shyamsundar Ranganathan <srangana@redhat.com> | 2015-01-12 09:16:08 -0800 |
commit | c49a77001bd80affa70d22ba974d8de9e3f0f0cd (patch) | |
tree | 15cf68f9bbe72f3d4d00f5ae750e4d8ac980af36 /api/src/glfs-handles.h | |
parent | f839e25a1ee67279c0c59da9d7262728133e8b37 (diff) |
api: versioned symbols in libgfapi.so for compatibility
Use versioned symbols to keep libgfapi at libgfapi.so.0.0.0
Revisited to address broken build on Mac OS X
See http://review.gluster.org/9036
Rebased to include http://review.gluster.org/#/c/9376/ (glfs_resolve())
but note that gerrit's "Rebase Change" couldn't do it.
N.B. noticed that glfs_get_volumeid() decl in glfs.h was missing
the __THROW, added it.
On systems using ELF and the GNU toolchain, symbol versions are created
with a .symver asm operand in the .c source file. Clang is claimed to
be compatible with gcc, so we'll pretend for now that this also works
with clang.
On Mac OS X, aliases are created with __asm "magic" in the .h header
file. In the normal case, when both the decl and defn match, that's
all that's needed. In our case though the decl and defn don't match ---
we have, e.g. a defn such as 'int glfs_foo(...)' and the corresponding
decl is 'int pub_glfs_foo(...)'. To make this work we create the necessary
aliases in the library at link time with the -alias_list link option.
Note that this results in there being pairs of symbols in the .dylib,
e.g. _pub_glfs_foo and _glfs_foo$GFAPI_3.4.0. We could use another
link option, -unexported_symbols_list to elide the _pub_glfs_* symbols.
(And we probably should.)
Linux symbol versioning was essentially copied from Solaris; in general
I would expect this to "just work" on Solaris, but until someone tries
we don't really know.
Change-Id: Icb96a3c2d80be7b6d7a6849bb9168f03a947f47c
BUG: 1160709
Signed-off-by: Kaleb S. KEITHLEY <kkeithle@redhat.com>
Reviewed-on: http://review.gluster.org/9143
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Niels de Vos <ndevos@redhat.com>
Reviewed-by: Shyamsundar Ranganathan <srangana@redhat.com>
Diffstat (limited to 'api/src/glfs-handles.h')
-rw-r--r-- | api/src/glfs-handles.h | 69 |
1 files changed, 46 insertions, 23 deletions
diff --git a/api/src/glfs-handles.h b/api/src/glfs-handles.h index ad963455e85..12bae6d6e86 100644 --- a/api/src/glfs-handles.h +++ b/api/src/glfs-handles.h @@ -87,83 +87,106 @@ typedef struct glfs_object glfs_object_t; struct glfs_object *glfs_h_lookupat (struct glfs *fs, struct glfs_object *parent, const char *path, - struct stat *stat) __THROW; + struct stat *stat) __THROW + GFAPI_PUBLIC(glfs_h_lookupat, 3.4.0); struct glfs_object *glfs_h_creat (struct glfs *fs, struct glfs_object *parent, const char *path, int flags, mode_t mode, - struct stat *sb) __THROW; + struct stat *sb) __THROW + GFAPI_PUBLIC(glfs_h_create, 3.4.0); struct glfs_object *glfs_h_mkdir (struct glfs *fs, struct glfs_object *parent, const char *path, mode_t flags, - struct stat *sb) __THROW; + struct stat *sb) __THROW + GFAPI_PUBLIC(glfs_h_mkdir, 3.4.0); struct glfs_object *glfs_h_mknod (struct glfs *fs, struct glfs_object *parent, const char *path, mode_t mode, dev_t dev, - struct stat *sb) __THROW; + struct stat *sb) __THROW + GFAPI_PUBLIC(glfs_h_mknod, 3.4.0); struct glfs_object *glfs_h_symlink (struct glfs *fs, struct glfs_object *parent, const char *name, const char *data, - struct stat *stat) __THROW; + struct stat *stat) __THROW + GFAPI_PUBLIC(glfs_h_symlink, 3.4.0); /* Operations on the actual objects */ int glfs_h_unlink (struct glfs *fs, struct glfs_object *parent, - const char *path) __THROW; + const char *path) __THROW + GFAPI_PUBLIC(glfs_h_unlink, 3.4.0); -int glfs_h_close (struct glfs_object *object) __THROW; +int glfs_h_close (struct glfs_object *object) __THROW + GFAPI_PUBLIC(glfs_h_close, 3.4.0); int glfs_caller_specific_init (void *uid_caller_key, void *gid_caller_key, - void *future) __THROW; + void *future) __THROW + GFAPI_PUBLIC(glfs_h_lookupat, 3.5.0); int glfs_h_truncate (struct glfs *fs, struct glfs_object *object, - off_t offset) __THROW; + off_t offset) __THROW + GFAPI_PUBLIC(glfs_h_truncate, 3.4.0); int glfs_h_stat(struct glfs *fs, struct glfs_object *object, - struct stat *stat) __THROW; + struct stat *stat) __THROW + GFAPI_PUBLIC(glfs_h_stat, 3.4.0); int glfs_h_getattrs (struct glfs *fs, struct glfs_object *object, - struct stat *stat) __THROW; + struct stat *stat) __THROW + GFAPI_PUBLIC(glfs_h_getattrs, 3.4.0); int glfs_h_getxattrs (struct glfs *fs, struct glfs_object *object, const char *name, void *value, - size_t size) __THROW; + size_t size) __THROW + GFAPI_PUBLIC(glfs_h_lookupat, 3.5.1); int glfs_h_setattrs (struct glfs *fs, struct glfs_object *object, - struct stat *sb, int valid) __THROW; + struct stat *sb, int valid) __THROW + GFAPI_PUBLIC(glfs_h_setattrs, 3.4.0); int glfs_h_setxattrs (struct glfs *fs, struct glfs_object *object, const char *name, const void *value, - size_t size, int flags) __THROW; + size_t size, int flags) __THROW + GFAPI_PUBLIC(glfs_h_setxattrs, 3.5.0); int glfs_h_readlink (struct glfs *fs, struct glfs_object *object, char *buf, - size_t bufsiz) __THROW; + size_t bufsiz) __THROW + GFAPI_PUBLIC(glfs_h_readlink, 3.4.0); int glfs_h_link (struct glfs *fs, struct glfs_object *linktgt, - struct glfs_object *parent, const char *name) __THROW; + struct glfs_object *parent, const char *name) __THROW + GFAPI_PUBLIC(glfs_h_link, 3.4.0); int glfs_h_rename (struct glfs *fs, struct glfs_object *olddir, const char *oldname, struct glfs_object *newdir, - const char *newname) __THROW; + const char *newname) __THROW + GFAPI_PUBLIC(glfs_h_rename, 3.4.0); int glfs_h_removexattrs (struct glfs *fs, struct glfs_object *object, - const char *name) __THROW; + const char *name) __THROW + GFAPI_PUBLIC(glfs_h_removexattrs, 3.5.1); /* Operations enabling opaque invariant handle to object transitions */ ssize_t glfs_h_extract_handle (struct glfs_object *object, - unsigned char *handle, int len) __THROW; + unsigned char *handle, int len) __THROW + GFAPI_PUBLIC(glfs_h_extract_handle, 3.4.0); struct glfs_object *glfs_h_create_from_handle (struct glfs *fs, unsigned char *handle, int len, - struct stat *stat) __THROW; + struct stat *stat) __THROW + GFAPI_PUBLIC(glfs_h_create_from_handle, 3.4.0); /* Operations enabling object handles to fd transitions */ struct glfs_fd *glfs_h_opendir (struct glfs *fs, - struct glfs_object *object) __THROW; + struct glfs_object *object) __THROW + GFAPI_PUBLIC(glfs_h_opendir, 3.4.0); struct glfs_fd *glfs_h_open (struct glfs *fs, struct glfs_object *object, - int flags) __THROW; + int flags) __THROW + GFAPI_PUBLIC(glfs_h_open, 3.4.0); int -glfs_h_access (struct glfs *fs, struct glfs_object *object, int mask) __THROW; +glfs_h_access (struct glfs *fs, struct glfs_object *object, int mask) __THROW + GFAPI_PUBLIC(glfs_h_access, 3.6.0); __END_DECLS |