On Wed, 2011-02-23 at 15:18 +0100, Corinna Vinschen wrote:
On Feb 23 14:52, Balazs Scheidler wrote:
On Wed, 2011-02-23 at 14:31 +0100, Corinna Vinschen wrote:
On Feb 23 14:11, Balazs Scheidler wrote:
Am I missing something else?
Well, yes. As outlined in https://lists.balabit.hu/pipermail/syslog-ng/2011-February/016006.html there are two problems:
- You can't link against a static lib when creating a shared lib. That means, creating libdbparser.so will fail. My patch results in creating a shared libsyslog-ng-patterndb.so for linking libdbparser.so, and a static libsyslog-ng-patterndb.a for linking pdbtool. Marking both libsyslog-ng-patterndb as noinst is just to avoid that both convenience libs are installed.
hmm.. not even with -fPIC ? If I have to duplicate executable code into pdbtool anyway (because of static linking it), I'd rather not have a separate .so which is only loaded by an .so.
-fPIC and -fpic have no effect on Windows. The Windows loader doesn't support position independent code. So, no, it won't work either.
If that's the case, I'd include the same source files into both targets (the .la one and pdbtool one)
- The link order is important when creating binaries on the Windows platform. Since libsyslog-ng-patterndb.a reference symbols in ../../lib/libsyslog-ng.la, you must reorder them on the command line. Not
../../lib/libsyslog-ng.la libsyslog-ng-patterndb.a
but
libsyslog-ng-patterndb.a ../../lib/libsyslog-ng.la
Ok, I've missed that, and changed my Makefile.
My patch fixes both problems. The result should work on all platforms.
Thanks for your efforts, and sorry for missing the point. Hopefully we can close this once and for all :)
No worries. However, something else occured to me a couple of minutes ago. If you apply my patch, you must change
noinst_LTLIBRARIES = libsyslog-ng-patterndb.la
to
lib_LTLIBRARIES = libsyslog-ng-patterndb.la
If you keep it in noinst_LTLIBRARIES, the libdbparse.so module will be broken after installtion because it requires libsyslog-ng-patterndb.so to run. Sorry for forgetting that.
There are two ways to fix this.
- Move libsyslog-ng-patterndb.so to module_LTLIBRARIES and install it.
- Don't generate libsyslog-ng-patterndb.so. Instead add the patterndb source files to libdbparser_la_SOURCES, along these lines:
diff --git a/modules/dbparser/Makefile.am b/modules/dbparser/Makefile.am index b2ab700..f8a53f4 100644 --- a/modules/dbparser/Makefile.am +++ b/modules/dbparser/Makefile.am @@ -21,7 +21,8 @@ libsyslog_ng_patterndb_a_CFLAGS = $(AM_CFLAGS) -fPIC module_LTLIBRARIES = libdbparser.la libdbparser_la_SOURCES = \ dbparser.c dbparser.h \ - dbparser-grammar.y dbparser-parser.c dbparser-parser.h dbparser-plugin.c + dbparser-grammar.y dbparser-parser.c dbparser-parser.h \ + dbparser-plugin.c $(libsyslog_ng_patterndb_a_SOURCES)
libdbparser_la_CPPFLAGS = $(AM_CPPFLAGS) libdbparser_la_LIBADD = ../../lib/libsyslog-ng.la libsyslog-ng-patterndb.a
I think this second solution is better.
Before making a fool from myself, can you please check if this patch is OK, before commit & push? (against the current HEAD). My intention was: * create a static lib for linking with programs (unit tests & pdbtool) * recompile each source files as a part of the shared library separately This way: * no linking of static lib into shared lib happens Also, a heads up: this will be a problem again in syslog-ng OSE 3.3, where I started to embed dependent libraries into the syslog-ng tree (ivykis, libmongo-client) because those are not yet in widespread use. That's implemented using static libraries and -fPIC, and I don't see an easy solution for that problem, unless of course one obtains and installs those libraries separately. thanks. $ git diff diff --git a/modules/dbparser/Makefile.am b/modules/dbparser/Makefile.am index b2ab700..7e4c366 100644 --- a/modules/dbparser/Makefile.am +++ b/modules/dbparser/Makefile.am @@ -11,26 +11,30 @@ AM_CPPFLAGS = -I$(top_srcdir)/lib -I../../lib AM_CFLAGS = @CFLAGS_NOWARN_POINTER_SIGN@ export top_srcdir -lib_LIBRARIES = libsyslog-ng-patterndb.a +noinst_LIBRARIES = libsyslog-ng-patterndb.a libsyslog_ng_patterndb_a_SOURCES = radix.c radix.h \ patterndb.c patterndb.h patterndb-int.h \ timerwheel.c timerwheel.h \ patternize.c patternize.h -libsyslog_ng_patterndb_a_CFLAGS = $(AM_CFLAGS) -fPIC +# we're not linking against the .a file as this is not supported on Cygwin, +# even if we compile it using -fPIC. Therefore the .a file is only used to +# link programs, and the dbparser.so gets those files as source files, +# thereby recompiling them twice. module_LTLIBRARIES = libdbparser.la libdbparser_la_SOURCES = \ dbparser.c dbparser.h \ - dbparser-grammar.y dbparser-parser.c dbparser-parser.h dbparser-plugin.c + dbparser-grammar.y dbparser-parser.c dbparser-parser.h dbparser-plugin.c \ + $(libsyslog_ng_patterndb_a_SOURCES) libdbparser_la_CPPFLAGS = $(AM_CPPFLAGS) -libdbparser_la_LIBADD = ../../lib/libsyslog-ng.la libsyslog-ng-patterndb.a +libdbparser_la_LIBADD = ../../lib/libsyslog-ng.la libdbparser_la_LDFLAGS = -avoid-version -module -no-undefined bin_PROGRAMS = pdbtool pdbtool_SOURCES = pdbtool.c pdbtool_CPPFLAGS = $(AM_CPPFLAGS) @OPENSSL_CFLAGS@ -pdbtool_LDADD = ../../lib/libsyslog-ng.la libsyslog-ng-patterndb.a @TOOL_DEPS_LIBS@ @OPENSSL_LIBS@ +pdbtool_LDADD = libsyslog-ng-patterndb.a ../../lib/libsyslog-ng.la @TOOL_DEPS_LIBS@ @OPENSSL_LIBS@ BUILT_SOURCES = dbparser-grammar.y dbparser-grammar.c dbparser-grammar.h EXTRA_DIST = $(BUILT_SOURCES) radix-find.c dbparser-grammar.ym diff --git a/modules/dbparser/tests/Makefile.am b/modules/dbparser/tests/Makefile.am index 8d3a970..6726121 100644 --- a/modules/dbparser/tests/Makefile.am +++ b/modules/dbparser/tests/Makefile.am @@ -1,6 +1,6 @@ AM_CFLAGS = -I$(top_srcdir)/lib -I../../../lib -I$(top_srcdir)/modules/dbparser -I.. @CFLAGS_NOWARN_POINTER_SIGN@ AM_LDFLAGS = -dlpreopen ../../syslogformat/libsyslogformat.la -LDADD = $(top_builddir)/lib/libsyslog-ng.la ../libsyslog-ng-patterndb.a ../patternize.lo @TOOL_DEPS_LIBS@ @OPENSSL_LIBS@ +LDADD = $(top_builddir)/lib/libsyslog-ng.la ../libsyslog-ng-patterndb.a @TOOL_DEPS_LIBS@ @OPENSSL_LIBS@ check_PROGRAMS = test_timer_wheel test_patternize test_patterndb test_radix -- Bazsi