| 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 |
| |