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