From 3b5e6774ed9743fb726ac8c15341eaa09375cfbf Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 8 Nov 2016 09:48:53 -0800 Subject: [PATCH] Port to FreeBSD 11 AMD Problem reported by Ashish Shukla (Bug#24892). I tested this on FreeBSD 11 x86-64 with HAVE_SBRK manually undefined. * configure.ac (system_malloc): Set to 'yes' if there is no sbrk. (sbrk): Check whether it exists. * src/alloc.c (my_heap_start) [!GNU_LINUX]: Do not define, since this function is now used only on GNU/Linux, and sbrk might not exist on other platforms. (malloc_initialize_hook) [!GNU_LINUX]: Do not call my_heap_start, since its side effect will never be used. (Fmemory_limit) [!HAVE_SBRK]: Do not call sbrk. * src/unexelf.c (unexec) [!HAVE_SBRK]: Assume that nothing like sbrk exists. --- configure.ac | 8 ++++---- src/alloc.c | 6 ++++-- src/unexelf.c | 4 ++++ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index f67fe83081e..7450e2f7274 100644 --- a/configure.ac +++ b/configure.ac @@ -2151,14 +2151,14 @@ AC_CACHE_CHECK( fi]) doug_lea_malloc=$emacs_cv_var_doug_lea_malloc -system_malloc=$emacs_cv_sanitize_address - hybrid_malloc= +system_malloc=yes case "$opsys" in ## darwin ld insists on the use of malloc routines in the System framework. - darwin | mingw32 | nacl | sol2-10) system_malloc=yes ;; + darwin | mingw32 | nacl | sol2-10) ;; cygwin) hybrid_malloc=yes;; + *) test "$ac_cv_func_sbrk" = yes && system_malloc=$emacs_cv_sanitize_address;; esac if test "${system_malloc}" != yes && test "${doug_lea_malloc}" != yes \ @@ -4155,7 +4155,7 @@ AC_CHECK_HEADERS(valgrind/valgrind.h) AC_CHECK_MEMBERS([struct unipair.unicode], [], [], [[#include ]]) -AC_CHECK_FUNCS_ONCE(tzset) +AC_CHECK_FUNCS_ONCE([sbrk tzset]) ok_so_far=yes AC_CHECK_FUNC(socket, , ok_so_far=no) diff --git a/src/alloc.c b/src/alloc.c index a58dc13cbd7..90c6f9441fa 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -97,7 +97,7 @@ static bool valgrind_p; #include "w32heap.h" /* for sbrk */ #endif -#if defined DOUG_LEA_MALLOC || defined GNU_LINUX +#ifdef GNU_LINUX /* The address where the heap starts. */ void * my_heap_start (void) @@ -130,7 +130,9 @@ malloc_initialize_hook (void) if (! initialized) { +#ifdef GNU_LINUX my_heap_start (); +#endif malloc_using_checking = getenv ("MALLOC_CHECK_") != NULL; } else @@ -7053,7 +7055,7 @@ We divide the value by 1024 to make sure it fits in a Lisp integer. */) { Lisp_Object end; -#ifdef HAVE_NS +#if defined HAVE_NS || !HAVE_SBRK /* Avoid warning. sbrk has no relation to memory allocated anyway. */ XSETINT (end, 0); #else diff --git a/src/unexelf.c b/src/unexelf.c index 551915712fb..748e7a42cfa 100644 --- a/src/unexelf.c +++ b/src/unexelf.c @@ -329,7 +329,11 @@ unexec (const char *new_name, const char *old_name) if (old_bss_index == -1) fatal ("no bss section found"); +#ifdef HAVE_SBRK new_break = sbrk (0); +#else + new_break = (byte *) old_bss_addr + old_bss_size; +#endif new_bss_addr = (ElfW (Addr)) new_break; bss_size_growth = new_bss_addr - old_bss_addr; new_data2_size = bss_size_growth; -- 2.39.5