diff mbox

quagga: fix static link with zlib

Message ID a27f85c8a78ed278549be2823c8e8ce4025f32be.1471761559.git.baruch@tkos.co.il
State Accepted
Headers show

Commit Message

Baruch Siach Aug. 21, 2016, 6:39 a.m. UTC
quagga links with zlib indirectly via netsnmp -> openssl -> zlib. quagga and
zlib both define the identically named but otherwise unrelated 'zcalloc'
symbol. This breaks static linking. Add a patch that renames the offending
symbol, thus fixing the build.

Fixes:
http://autobuild.buildroot.net/results/013/01317aeaff7d127a05e0488a51e81f2d43750687/
http://autobuild.buildroot.net/results/e9f/e9f17bb6e048c3dd3c65fc588dc5244fbbbba6fb/
http://autobuild.buildroot.net/results/72b/72b5e8a3d4c1d27c61cdad5a90691117d0dcfbb9/

Signed-off-by: Baruch Siach <baruch@tkos.co.il>
---
 ...memory-fix-indirect-static-link-with-zlib.patch | 108 +++++++++++++++++++++
 1 file changed, 108 insertions(+)
 create mode 100644 package/quagga/0003-lib-memory-fix-indirect-static-link-with-zlib.patch

Comments

Thomas Petazzoni Aug. 21, 2016, 8:23 p.m. UTC | #1
Hello,

On Sun, 21 Aug 2016 09:39:19 +0300, Baruch Siach wrote:
> quagga links with zlib indirectly via netsnmp -> openssl -> zlib. quagga and
> zlib both define the identically named but otherwise unrelated 'zcalloc'
> symbol. This breaks static linking. Add a patch that renames the offending
> symbol, thus fixing the build.
> 
> Fixes:
> http://autobuild.buildroot.net/results/013/01317aeaff7d127a05e0488a51e81f2d43750687/
> http://autobuild.buildroot.net/results/e9f/e9f17bb6e048c3dd3c65fc588dc5244fbbbba6fb/
> http://autobuild.buildroot.net/results/72b/72b5e8a3d4c1d27c61cdad5a90691117d0dcfbb9/
> 
> Signed-off-by: Baruch Siach <baruch@tkos.co.il>
> ---
>  ...memory-fix-indirect-static-link-with-zlib.patch | 108 +++++++++++++++++++++
>  1 file changed, 108 insertions(+)
>  create mode 100644 package/quagga/0003-lib-memory-fix-indirect-static-link-with-zlib.patch

Thanks for fixing this issue. I'm not sure zzcalloc is really the best
name, but it's fine for now. Could you submit upstream? They will
probably decide of a better name, if need be.

Thanks again, applied to master!

Thomas
diff mbox

Patch

diff --git a/package/quagga/0003-lib-memory-fix-indirect-static-link-with-zlib.patch b/package/quagga/0003-lib-memory-fix-indirect-static-link-with-zlib.patch
new file mode 100644
index 000000000000..6990f47cda1c
--- /dev/null
+++ b/package/quagga/0003-lib-memory-fix-indirect-static-link-with-zlib.patch
@@ -0,0 +1,108 @@ 
+From 008dd9771057dbbd7ce971c43bce2a0b05e2cf97 Mon Sep 17 00:00:00 2001
+From: Baruch Siach <baruch@tkos.co.il>
+Date: Sun, 21 Aug 2016 08:56:57 +0300
+Subject: [PATCH] lib/memory: fix indirect static link with zlib
+
+quagga SNMP support depends on netsnmp, that optionally depends on OpenSSL,
+which in turn requires zlib. zlib exports the 'zcalloc' symbol, which collides
+with a function of the same name in memory.c. This is not a problem when
+linking dynamically, since quagga does not use zlib directly. But static
+linking fails with the error:
+
+  CCLD     ospfd
+.../output/host/usr/mips64el-buildroot-linux-uclibc/sysroot/usr/lib/libz.a(zutil.o): In function `zcalloc':
+zutil.c:(.text+0x48): multiple definition of `zcalloc'
+.../output/build/quagga-1.0.20160315/lib/.libs/libzebra.a(memory.o):memory.c:(.text+0x1a0): first defined here
+
+Rename 'zcalloc' to 'zzcalloc' to avoid symbol collision.
+
+Signed-off-by: Baruch Siach <baruch@tkos.co.il>
+---
+Patch status: posted upstream
+https://lists.quagga.net/pipermail/quagga-dev/2016-August/016109.html
+
+ lib/memory.c | 14 ++++++++------
+ lib/memory.h |  4 ++--
+ 2 files changed, 10 insertions(+), 8 deletions(-)
+
+diff --git a/lib/memory.c b/lib/memory.c
+index 269520d5a435..b1680a5e6f07 100644
+--- a/lib/memory.c
++++ b/lib/memory.c
+@@ -80,9 +80,11 @@ zmalloc (int type, size_t size)
+ 
+ /*
+  * Allocate memory as in zmalloc, and also clear the memory.
++ * Add an extra 'z' prefix to function name to avoid collision when linking
++ * statically with zlib that exports the 'zcalloc' symbol.
+  */
+ void *
+-zcalloc (int type, size_t size)
++zzcalloc (int type, size_t size)
+ {
+   void *memory;
+ 
+@@ -97,9 +99,9 @@ zcalloc (int type, size_t size)
+ }
+ 
+ /* 
+- * Given a pointer returned by zmalloc or zcalloc, free it and
++ * Given a pointer returned by zmalloc or zzcalloc, free it and
+  * return a pointer to a new size, basically acting like realloc().
+- * Requires: ptr was returned by zmalloc, zcalloc, or zrealloc with the
++ * Requires: ptr was returned by zmalloc, zzcalloc, or zrealloc with the
+  * same type.
+  * Effects: Returns a pointer to the new memory, or aborts.
+  */
+@@ -109,7 +111,7 @@ zrealloc (int type, void *ptr, size_t size)
+   void *memory;
+ 
+   if (ptr == NULL)              /* is really alloc */
+-      return zcalloc(type, size);
++      return zzcalloc(type, size);
+ 
+   memory = realloc (ptr, size);
+   if (memory == NULL)
+@@ -122,7 +124,7 @@ zrealloc (int type, void *ptr, size_t size)
+ 
+ /*
+  * Free memory allocated by z*alloc or zstrdup.
+- * Requires: ptr was returned by zmalloc, zcalloc, or zrealloc with the
++ * Requires: ptr was returned by zmalloc, zzcalloc, or zrealloc with the
+  * same type.
+  * Effects: The memory is freed and may no longer be referenced.
+  */
+@@ -196,7 +198,7 @@ mtype_zcalloc (const char *file, int line, int type, size_t size)
+   mstat[type].c_calloc++;
+   mstat[type].t_calloc++;
+ 
+-  memory = zcalloc (type, size);
++  memory = zzcalloc (type, size);
+   mtype_log ("xcalloc", memory, file, line, type);
+ 
+   return memory;
+diff --git a/lib/memory.h b/lib/memory.h
+index 23962235dbfe..501352993d21 100644
+--- a/lib/memory.h
++++ b/lib/memory.h
+@@ -56,7 +56,7 @@ extern struct mlist mlists[];
+   mtype_zstrdup (__FILE__, __LINE__, (mtype), (str))
+ #else
+ #define XMALLOC(mtype, size)       zmalloc ((mtype), (size))
+-#define XCALLOC(mtype, size)       zcalloc ((mtype), (size))
++#define XCALLOC(mtype, size)       zzcalloc ((mtype), (size))
+ #define XREALLOC(mtype, ptr, size) zrealloc ((mtype), (ptr), (size))
+ #define XFREE(mtype, ptr)          do { \
+                                      zfree ((mtype), (ptr)); \
+@@ -67,7 +67,7 @@ extern struct mlist mlists[];
+ 
+ /* Prototypes of memory function. */
+ extern void *zmalloc (int type, size_t size);
+-extern void *zcalloc (int type, size_t size);
++extern void *zzcalloc (int type, size_t size);
+ extern void *zrealloc (int type, void *ptr, size_t size);
+ extern void  zfree (int type, void *ptr);
+ extern char *zstrdup (int type, const char *str);
+-- 
+2.8.1
+