]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
buffer: fix iterator_impl visibility through typedef 10552/head
authorNoah Watkins <noahwatkins@gmail.com>
Wed, 16 Mar 2016 21:12:05 +0000 (14:12 -0700)
committerKefu Chai <kchai@redhat.com>
Tue, 2 Aug 2016 09:01:03 +0000 (17:01 +0800)
The following program doesn't compile because of symbol visibility issues.
While bufferlist::iterator is a class implementation with visibility specified,
it is unclear after google-fu how to do the same through typedef.

int main()
{
 ceph::bufferlist bl;
 ceph::bufferlist::const_iterator it = bl.begin();
 (void)it;
 return 0;
}

[nwatkins@bender ~]$ g++ -Wall -std=c++11 -Iinstall/include -Linstall/lib -o test test.cc -lrados
/tmp/cciR9MUj.o: In function `main':
test.cc:(.text+0x43): undefined reference to `ceph::buffer::list::iterator_impl<true>::iterator_impl(ceph::buffer::list::iterator const&)'
/usr/bin/ld: test: hidden symbol `_ZN4ceph6buffer4list13iterator_implILb1EEC1ERKNS1_8iteratorE' isn't defined
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status

Signed-off-by: Noah Watkins <noahwatkins@gmail.com>
(cherry picked from commit 16bc3e59325d4057d36cd63a57111ab36fbc50fd)

src/include/buffer.h

index c786bf27915a13880af31f0d66421c8d521720f1..363cf635425562258d7bc25a48dfd1bfeae39dd9 100644 (file)
 
 #if __GNUC__ >= 4
   #define CEPH_BUFFER_API  __attribute__ ((visibility ("default")))
-  #define CEPH_BUFFER_DETAILS __attribute__ ((visibility ("hidden")))
 #else
   #define CEPH_BUFFER_API
-  #define CEPH_BUFFER_DETAILS
 #endif
 
 #if defined(HAVE_XIO)
@@ -270,7 +268,7 @@ namespace buffer CEPH_BUFFER_API {
 
   private:
     template <bool is_const>
-    class CEPH_BUFFER_DETAILS iterator_impl
+    class CEPH_BUFFER_API iterator_impl
       : public std::iterator<std::forward_iterator_tag, char> {
     protected:
       typedef typename std::conditional<is_const,