* Symbol visibility
@ 2013-01-13 13:37 Dániel Varga
0 siblings, 0 replies; only message in thread
From: Dániel Varga @ 2013-01-13 13:37 UTC (permalink / raw)
To: gcc-help
Hi,
I try to understand symbol visibility better. The GCC Wiki
(http://gcc.gnu.org/wiki/Visibility) has a section about "Problems
with C++ exceptions". According to GCC Wiki it is possible the have
_runtime_ error because of not exported exceptions. Runtime errors
without compile time error/warning is quite dangerous so I tried to
understand the problem better. I made some experiments but I still
can't reproduce it. Any ideas how to reproduce the problem?
The Wiki mentions three library using each other, so I made three small library.
I run the following commands:
Exception class without vtable (works as expected):
make
./dsouser
Exception class with vtable but it does not exported (does not even compile):
make HAS_VIRTUAL=1
Exception class exported vtable (works as expected):
make HAS_VIRTUAL=1 EXCEPTION_VISIBLE=1
./dsouser
Makefile:
CXX=g++-4.7.1
CFLAGS=-ggdb -O0 -fvisibility=hidden
ifdef EXCEPTION_VISIBLE
CFLAGS+=-DEXCEPTION_VISIBLE
endif
ifdef HAS_VIRTUAL
CFLAGS+=-DHAS_VIRTUAL
endif
all: dsouser
libmydso.so: mydso.cpp mydso.h
$(CXX) $(CFLAGS) -fPIC -shared -Wl,-soname,$@ -o $@ $<
libmydso2.so: mydso2.cpp mydso.h mydso2.h libmydso.so
$(CXX) $(CFLAGS) -L. -fPIC -shared -Wl,-soname,$@ -o $@ $< -lmydso
libmydso3.so: mydso3.cpp mydso.h mydso2.h mydso3.h libmydso2.so
$(CXX) $(CFLAGS) -L. -fPIC -shared -Wl,-soname,$@ -o $@ $<
-lmydso -lmydso2
dsouser: dsouser.cpp libmydso3.so
$(CXX) $< $(CFLAGS) -L. -o $@ -lmydso -lmydso2 -lmydso3
clean:
rm -f *.so *.o dsouser
.PHONY: all clean
mydso.h:
#ifndef DSO_H_INCLUDED
#define DSO_H_INCLUDED
#include <exception>
#define SYMBOL_VISIBLE __attribute__ ((visibility ("default")))
namespace dso
{
class
#ifdef EXCEPTION_VISIBLE
SYMBOL_VISIBLE
#endif
MyException : public std::exception
{
public:
#ifdef HAS_VIRTUAL
virtual void dump();
#endif
void SYMBOL_VISIBLE foo();
};
}
#endif
mydso.cpp:
#include <iostream>
#include "mydso.h"
namespace dso
{
#ifdef HAS_VIRTUAL
void MyException::dump()
{
}
#endif
void MyException::foo()
{
#ifdef HAS_VIRTUAL
dump();
#endif
}
}
mydso2.h:
#ifndef DSO2_H_INCLUDED
#define DSO2_H_INCLUDED
#define SYMBOL_VISIBLE __attribute__ ((visibility ("default")))
namespace dso2
{
void SYMBOL_VISIBLE some_func();
}
#endif
mydso2.cpp:
#include <iostream>
#include "mydso.h"
#include "mydso2.h"
namespace dso2
{
void some_func()
{
throw dso::MyException();
}
}
mydso3.h:
#ifndef DSO3_H_INCLUDED
#define DSO3_H_INCLUDED
#define SYMBOL_VISIBLE __attribute__ ((visibility ("default")))
namespace dso3
{
void SYMBOL_VISIBLE some_func();
}
#endif
mydso3.cpp:
#include <iostream>
#include "mydso2.h"
#include "mydso3.h"
#include <iostream>
namespace dso3
{
void some_func()
{
try
{
dso2::some_func();
} catch (std::exception e)
{
std::cout << "Got exception\n";
}
}
}
dsouser.cpp:
#include <iostream>
#include "mydso3.h"
int main()
{
dso3::some_func();
return 0;
}
Thanks,
Dani
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2013-01-12 10:44 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-01-13 13:37 Symbol visibility Dániel Varga
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).