From aee8af31f3afc9b71d526be3a9629d0aa7a9dce5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 7 Jun 2017 12:19:24 +0530 Subject: [PATCH] Hide all symbols in the compiled python extensions on unix They were already hidden on windows. Avoids the possibility of symbol collisions and also means ld has to do less work when loading them extensions. --- setup/build.py | 8 ++++++++ src/calibre/devices/libusb/libusb.c | 2 +- src/calibre/devices/mtp/unix/libmtp.c | 2 +- src/calibre/devices/mtp/windows/wpd.cpp | 2 +- src/calibre/devices/usbobserver/usbobserver.c | 2 +- src/calibre/ebooks/compression/palmdoc.c | 2 +- src/calibre/ebooks/djvu/bzzdecoder.c | 2 +- src/calibre/gui2/tweak_book/diff/_patiencediff_c.c | 2 +- src/calibre/gui2/tweak_book/editor/syntax/html.c | 2 +- src/calibre/library/sqlite_custom.c | 4 ++-- src/calibre/utils/certgen.c | 2 +- src/calibre/utils/chm/extra.c | 2 +- src/calibre/utils/chm/swig_chm.c | 2 +- src/calibre/utils/fonts/freetype.cpp | 2 +- src/calibre/utils/fonts/winfonts.cpp | 2 +- src/calibre/utils/icu.c | 2 +- src/calibre/utils/lzx/lzxmodule.c | 2 +- src/calibre/utils/matcher.c | 2 +- src/calibre/utils/monotonic.c | 2 +- src/calibre/utils/msdes/msdesmodule.c | 2 +- src/calibre/utils/podofo/podofo.cpp | 2 +- src/calibre/utils/speedup.c | 2 +- src/calibre/utils/spell/hunspell_wrapper.cpp | 3 +-- src/calibre/utils/unrar.cpp | 2 +- src/calibre/utils/windows/winutil.c | 2 +- src/calibre/utils/zlib2.c | 2 +- src/duktape/module.c | 7 ++++++- src/lzma/lzma_binding.c | 2 +- src/tinycss/tokenizer.c | 2 +- 29 files changed, 42 insertions(+), 30 deletions(-) diff --git a/setup/build.py b/setup/build.py index d6de2eb1b0..a720370559 100644 --- a/setup/build.py +++ b/setup/build.py @@ -34,6 +34,13 @@ class Extension(object): self.error = d['error'] = kwargs.get('error', None) self.libraries = d['libraries'] = kwargs.get('libraries', []) self.cflags = d['cflags'] = kwargs.get('cflags', []) + if iswindows: + self.cflags.append('/DCALIBRE_MODINIT_FUNC=PyMODINIT_FUNC') + else: + if self.needs_cxx: + self.cflags.append('-DCALIBRE_MODINIT_FUNC=extern "C" __attribute__ ((visibility ("default"))) void') + else: + self.cflags.append('-DCALIBRE_MODINIT_FUNC=__attribute__ ((visibility ("default"))) void') self.ldflags = d['ldflags'] = kwargs.get('ldflags', []) self.optional = d['options'] = kwargs.get('optional', False) of = kwargs.get('optimize_level', None) @@ -145,6 +152,7 @@ def init_env(): ldflags = shlex.split(ldflags) cflags += shlex.split(os.environ.get('CFLAGS', '')) ldflags += shlex.split(os.environ.get('LDFLAGS', '')) + cflags += ['-fvisibility=hidden'] if islinux: cflags.append('-pthread') diff --git a/src/calibre/devices/libusb/libusb.c b/src/calibre/devices/libusb/libusb.c index 843459cd98..5cef316a5d 100644 --- a/src/calibre/devices/libusb/libusb.c +++ b/src/calibre/devices/libusb/libusb.c @@ -119,7 +119,7 @@ static PyMethodDef libusb_methods[] = { {NULL, NULL, 0, NULL} }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initlibusb(void) { PyObject *m; diff --git a/src/calibre/devices/mtp/unix/libmtp.c b/src/calibre/devices/mtp/unix/libmtp.c index 9539a4b7d7..086211484c 100644 --- a/src/calibre/devices/mtp/unix/libmtp.c +++ b/src/calibre/devices/mtp/unix/libmtp.c @@ -712,7 +712,7 @@ static PyMethodDef libmtp_methods[] = { }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initlibmtp(void) { PyObject *m; diff --git a/src/calibre/devices/mtp/windows/wpd.cpp b/src/calibre/devices/mtp/windows/wpd.cpp index 867ce6bcee..6901d5472e 100644 --- a/src/calibre/devices/mtp/windows/wpd.cpp +++ b/src/calibre/devices/mtp/windows/wpd.cpp @@ -182,7 +182,7 @@ static PyMethodDef wpd_methods[] = { }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initwpd(void) { PyObject *m; diff --git a/src/calibre/devices/usbobserver/usbobserver.c b/src/calibre/devices/usbobserver/usbobserver.c index 3b4f3aa546..c3ac61d718 100644 --- a/src/calibre/devices/usbobserver/usbobserver.c +++ b/src/calibre/devices/usbobserver/usbobserver.c @@ -482,7 +482,7 @@ static PyMethodDef usbobserver_methods[] = { {NULL, NULL, 0, NULL} }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initusbobserver(void) { (void) Py_InitModule("usbobserver", usbobserver_methods); } diff --git a/src/calibre/ebooks/compression/palmdoc.c b/src/calibre/ebooks/compression/palmdoc.c index ac4a6c9097..7c29372481 100644 --- a/src/calibre/ebooks/compression/palmdoc.c +++ b/src/calibre/ebooks/compression/palmdoc.c @@ -195,7 +195,7 @@ static PyMethodDef cPalmdocMethods[] = { {NULL, NULL, 0, NULL} }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initcPalmdoc(void) { PyObject *m; m = Py_InitModule3("cPalmdoc", cPalmdocMethods, diff --git a/src/calibre/ebooks/djvu/bzzdecoder.c b/src/calibre/ebooks/djvu/bzzdecoder.c index 0df9e488ff..1e355609f9 100644 --- a/src/calibre/ebooks/djvu/bzzdecoder.c +++ b/src/calibre/ebooks/djvu/bzzdecoder.c @@ -694,7 +694,7 @@ static PyMethodDef bzzdecmethods[] = { -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initbzzdec(void) { PyObject *m; m = Py_InitModule3("bzzdec", bzzdecmethods, diff --git a/src/calibre/gui2/tweak_book/diff/_patiencediff_c.c b/src/calibre/gui2/tweak_book/diff/_patiencediff_c.c index 0f0d380716..6af903376a 100644 --- a/src/calibre/gui2/tweak_book/diff/_patiencediff_c.c +++ b/src/calibre/gui2/tweak_book/diff/_patiencediff_c.c @@ -1258,7 +1258,7 @@ static PyMethodDef cpatiencediff_methods[] = { }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC init_patiencediff_c(void) { PyObject* m; diff --git a/src/calibre/gui2/tweak_book/editor/syntax/html.c b/src/calibre/gui2/tweak_book/editor/syntax/html.c index 21ce39e69e..7b0fed55f4 100644 --- a/src/calibre/gui2/tweak_book/editor/syntax/html.c +++ b/src/calibre/gui2/tweak_book/editor/syntax/html.c @@ -474,7 +474,7 @@ static PyMethodDef html_methods[] = { }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC inithtml(void) { PyObject *m, *temp; if (PyType_Ready(&html_TagType) < 0) diff --git a/src/calibre/library/sqlite_custom.c b/src/calibre/library/sqlite_custom.c index 8b45044ca9..c24c58f15a 100644 --- a/src/calibre/library/sqlite_custom.c +++ b/src/calibre/library/sqlite_custom.c @@ -10,7 +10,7 @@ SQLITE_EXTENSION_INIT1 #ifdef _MSC_VER #define MYEXPORT __declspec(dllexport) #else -#define MYEXPORT +#define MYEXPORT __attribute__ ((visibility ("default"))) #endif // sortconcat {{{ @@ -271,7 +271,7 @@ static PyMethodDef sqlite_custom_methods[] = { {NULL, NULL, 0, NULL} }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initsqlite_custom(void) { PyObject *m; m = Py_InitModule3("sqlite_custom", sqlite_custom_methods, diff --git a/src/calibre/utils/certgen.c b/src/calibre/utils/certgen.c index 730e8da709..2770156c38 100644 --- a/src/calibre/utils/certgen.c +++ b/src/calibre/utils/certgen.c @@ -379,7 +379,7 @@ static PyMethodDef certgen_methods[] = { }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initcertgen(void) { PyObject *m; m = Py_InitModule3("certgen", certgen_methods, diff --git a/src/calibre/utils/chm/extra.c b/src/calibre/utils/chm/extra.c index bafbf7bb07..b4fc13488a 100644 --- a/src/calibre/utils/chm/extra.c +++ b/src/calibre/utils/chm/extra.c @@ -708,7 +708,7 @@ IndexMethods[] = { #ifdef __cplusplus extern "C" #endif -MODEXPORT(void) +CALIBRE_MODINIT_FUNC initchm_extra (void) { Py_InitModule ("chm_extra", IndexMethods); } diff --git a/src/calibre/utils/chm/swig_chm.c b/src/calibre/utils/chm/swig_chm.c index 56017205b7..7a1e1dc776 100644 --- a/src/calibre/utils/chm/swig_chm.c +++ b/src/calibre/utils/chm/swig_chm.c @@ -1106,7 +1106,7 @@ static swig_const_info swig_const_table[] = { #ifdef __cplusplus extern "C" #endif -SWIGEXPORT(void) SWIG_init(void) { +CALIBRE_MODINIT_FUNC SWIG_init(void) { static PyObject *SWIG_globals = 0; static int typeinit = 0; PyObject *m, *d; diff --git a/src/calibre/utils/fonts/freetype.cpp b/src/calibre/utils/fonts/freetype.cpp index 58d014c6b9..f9242f1fcf 100644 --- a/src/calibre/utils/fonts/freetype.cpp +++ b/src/calibre/utils/fonts/freetype.cpp @@ -293,7 +293,7 @@ PyMethodDef methods[] = { {NULL, NULL, 0, NULL} }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initfreetype(void) { PyObject *m; diff --git a/src/calibre/utils/fonts/winfonts.cpp b/src/calibre/utils/fonts/winfonts.cpp index db023b14bb..9e15bda6e6 100644 --- a/src/calibre/utils/fonts/winfonts.cpp +++ b/src/calibre/utils/fonts/winfonts.cpp @@ -235,7 +235,7 @@ PyMethodDef winfonts_methods[] = { }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initwinfonts(void) { PyObject *m; m = Py_InitModule3( diff --git a/src/calibre/utils/icu.c b/src/calibre/utils/icu.c index 9b3699f196..3c52cb3265 100644 --- a/src/calibre/utils/icu.c +++ b/src/calibre/utils/icu.c @@ -1175,7 +1175,7 @@ static PyMethodDef icu_methods[] = { #define ADDUCONST(x) PyModule_AddIntConstant(m, #x, x) -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initicu(void) { PyObject* m; diff --git a/src/calibre/utils/lzx/lzxmodule.c b/src/calibre/utils/lzx/lzxmodule.c index 8b4b1f7c9b..410ade709d 100644 --- a/src/calibre/utils/lzx/lzxmodule.c +++ b/src/calibre/utils/lzx/lzxmodule.c @@ -202,7 +202,7 @@ static PyMethodDef lzx_methods[] = { { NULL } }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initlzx(void) { PyObject *m; diff --git a/src/calibre/utils/matcher.c b/src/calibre/utils/matcher.c index a06f468cf5..94ddd9ac35 100644 --- a/src/calibre/utils/matcher.c +++ b/src/calibre/utils/matcher.c @@ -508,7 +508,7 @@ static PyMethodDef matcher_methods[] = { }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initmatcher(void) { PyObject *m; MatcherType.tp_new = PyType_GenericNew; diff --git a/src/calibre/utils/monotonic.c b/src/calibre/utils/monotonic.c index 00fb1dbc73..beb8f91f8d 100644 --- a/src/calibre/utils/monotonic.c +++ b/src/calibre/utils/monotonic.c @@ -71,7 +71,7 @@ static PyMethodDef monotonic_methods[] = { {NULL, NULL, 0, NULL} }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initmonotonic(void) { PyObject *m; #ifdef _MSC_VER diff --git a/src/calibre/utils/msdes/msdesmodule.c b/src/calibre/utils/msdes/msdesmodule.c index 27ca46ffcb..66844fa510 100644 --- a/src/calibre/utils/msdes/msdesmodule.c +++ b/src/calibre/utils/msdes/msdesmodule.c @@ -78,7 +78,7 @@ static PyMethodDef msdes_methods[] = { { NULL, NULL } }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initmsdes(void) { PyObject *m; diff --git a/src/calibre/utils/podofo/podofo.cpp b/src/calibre/utils/podofo/podofo.cpp index 250c18b4a8..d4c6b58e91 100644 --- a/src/calibre/utils/podofo/podofo.cpp +++ b/src/calibre/utils/podofo/podofo.cpp @@ -38,7 +38,7 @@ class PyLogMessage : public PdfError::LogMessageCallback { PyLogMessage log_message; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initpodofo(void) { PyObject* m; diff --git a/src/calibre/utils/speedup.c b/src/calibre/utils/speedup.c index 93d13c020e..0c489bc919 100644 --- a/src/calibre/utils/speedup.c +++ b/src/calibre/utils/speedup.c @@ -483,7 +483,7 @@ static PyMethodDef speedup_methods[] = { }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initspeedup(void) { PyObject *m; m = Py_InitModule3("speedup", speedup_methods, diff --git a/src/calibre/utils/spell/hunspell_wrapper.cpp b/src/calibre/utils/spell/hunspell_wrapper.cpp index bdd61842af..09b3bdaf65 100644 --- a/src/calibre/utils/spell/hunspell_wrapper.cpp +++ b/src/calibre/utils/spell/hunspell_wrapper.cpp @@ -165,7 +165,7 @@ static PyTypeObject DictionaryType = { }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC inithunspell(void) { PyObject *mod; @@ -185,4 +185,3 @@ inithunspell(void) { Py_INCREF(&DictionaryType); PyModule_AddObject(mod, "Dictionary", (PyObject *)&DictionaryType); } - diff --git a/src/calibre/utils/unrar.cpp b/src/calibre/utils/unrar.cpp index 20dc0f72f8..625642a776 100644 --- a/src/calibre/utils/unrar.cpp +++ b/src/calibre/utils/unrar.cpp @@ -526,7 +526,7 @@ static PyTypeObject RARArchiveType = { // {{{ // }}} End RARArchive -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initunrar(void) { PyObject *m; diff --git a/src/calibre/utils/windows/winutil.c b/src/calibre/utils/windows/winutil.c index d4caa0be44..dee10862f0 100644 --- a/src/calibre/utils/windows/winutil.c +++ b/src/calibre/utils/windows/winutil.c @@ -384,7 +384,7 @@ be a unicode string. Returns unicode strings." {NULL, NULL, 0, NULL} }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initwinutil(void) { PyObject *m; m = Py_InitModule3("winutil", WinutilMethods, diff --git a/src/calibre/utils/zlib2.c b/src/calibre/utils/zlib2.c index 601687a07f..aa6f4682a6 100644 --- a/src/calibre/utils/zlib2.c +++ b/src/calibre/utils/zlib2.c @@ -383,7 +383,7 @@ static PyMethodDef methods[] = { {NULL, NULL, 0, NULL} }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initzlib2(void) { PyObject *m, *ver; Comptype.tp_new = PyType_GenericNew; diff --git a/src/duktape/module.c b/src/duktape/module.c index 864be7f06d..79a93c1748 100644 --- a/src/duktape/module.c +++ b/src/duktape/module.c @@ -63,7 +63,12 @@ static struct PyModuleDef moduledef = { }; #endif -PyMODINIT_FUNC +#ifdef _MSVC +#define EXPORTED __declspec(dllexport) +#else +#define EXPORTED __attribute__ ((visibility ("default"))) +#endif +EXPORTED PyMODINIT_FUNC #if PY_MAJOR_VERSION >= 3 PyInit_dukpy(void) #else diff --git a/src/lzma/lzma_binding.c b/src/lzma/lzma_binding.c index b6f787fe53..c01fdd0e77 100644 --- a/src/lzma/lzma_binding.c +++ b/src/lzma/lzma_binding.c @@ -412,7 +412,7 @@ static PyMethodDef lzma_binding_methods[] = { }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC initlzma_binding(void) { PyObject *m = NULL, *preset_map = NULL, *temp = NULL; int i = 0; diff --git a/src/tinycss/tokenizer.c b/src/tinycss/tokenizer.c index 19238ca4a6..98e7f0d6ec 100644 --- a/src/tinycss/tokenizer.c +++ b/src/tinycss/tokenizer.c @@ -416,7 +416,7 @@ static PyMethodDef tokenizer_methods[] = { }; -PyMODINIT_FUNC +CALIBRE_MODINIT_FUNC inittokenizer(void) { PyObject *m; if (PyType_Ready(&tokenizer_TokenType) < 0)