Re: ports/bash4 --enable-static fails

From: Sean Bruno <seanbru_at_yahoo-inc.com>
Date: Thu, 17 May 2012 15:15:33 -0700
On Thu, 2012-05-10 at 05:56 -0700, Chet Ramey wrote:
> On 5/10/12 12:20 AM, Craig Rodrigues wrote:
> 
> > Bash is trying to override the malloc() functions in libc with its own
> > implementation in lib/malloc/malloc.c .
> > I have seen this type of trick before 3rd party code that tries to
> > override the libc implementation of malloc() / free() with its own.
> > 
> > kan_at_ explained this to me before, but I don't know if I can explain it
> > as well as him, because it has to do
> > with how static linking works. :)
> > 
> > Basically, the malloc.o object from bash, *must* have implementations of
> > *all* the relevant functions in jemalloc_jemalloc.o in order for
> > malloc.o to properly override jemalloc_jemalloc.o.
> > 
> > If you have something like:
> > jemalloc_jemalloc.o  (libc)                   malloc.o (Bash)
> > ===============                           =============
> > malloc()                                              malloc()
> > free()                                                   free()
> > calloc()
> > realloc()
> > 
> > 
> > the static linker will not be able to replace jemalloc_jemalloc.o from
> > libc with malloc.o from Bash,
> > because calloc() and realloc() symbols in jemalloc_jemalloc.o (libc)
> > do not exist malloc.o (Bash).
> > 
> > Since the linker can only deal with whole objects (.o files), it will
> > try to pull in both
> > jemalloc_jemalloc.o and malloc.o when doing static linking.
> > 
> > I may have got some of the details/explanation wrong, but I have fixed
> > something similar
> > to this in 3rd party code, when the layout of malloc() functions in
> > libc changed between FreeBSD 4 and FreeBSD 6.
> 
> This explanation is substantially correct.
> 
> > 
> > What you need to do is:
> >    (1)  run nm or readelf on jemalloc_jemalloc.o,   then run nm or
> > readelf on malloc.o
> >    (2)  Look at the symbols in both
> >    (3)  Add the missing symbols to malloc.c in Bash
> 
> The bash malloc includes definitions for malloc/free/realloc/calloc/cfree/
> valloc/memalign.  I'd be interested in knowing what other global symbols
> jemalloc exports.  I'd also be interested in seeing how someone managed to
> compile the bash malloc and leave out realloc.
> 
> Chet

Just to kind of close the loop here, we went ahead and changed our local
build of bash to do:
./configure --enable-static-link --without-bash-malloc

This matches the ports implementation, so we have moved on here.

Sean
Received on Thu May 17 2012 - 20:16:05 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:27 UTC