]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
libelf: Check for mremap, elf_update needs it for ELF_C_RDWR_MMAP
authorMark Wielaard <mark@klomp.org>
Sun, 24 Apr 2022 17:42:29 +0000 (19:42 +0200)
committerMark Wielaard <mark@klomp.org>
Sun, 24 Apr 2022 17:42:29 +0000 (19:42 +0200)
Add a AC_CHECK_FUNCS configure check for mremap. Some systems like
KFreeBSD and the Hurd don't have it. Also add a configure warning
because without mremap elf_update will often fail when ELF_C_RDWR_MMAP
is used. ELF_C_RDWR_MMAP is an elfutils extension to libelf.

https://sourceware.org/bugzilla/show_bug.cgi?id=27337

Signed-off-by: Mark Wielaard <mark@klomp.org>
ChangeLog
configure.ac
libelf/ChangeLog
libelf/elf_update.c

index 3357f69b837ad62336df6fe748b325a0e3c192d4..f0cd28a8ddbe98863ec97f78635598b4e732c6b9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2022-04-24  Mark Wielaard  <mark@klomp.org>
+
+       * configure.ac (AC_CHECK_FUNCS): Add mremap.
+
 2021-03-20  Mark Wielaard  <mark@klomp.org>
 
        * configure.ac: Remove -m64 on 32bit target comments for
index 2418d474cb4d2d7fbe04616e5e7ed301eb90781a..33c4b5e517b1f911802ff1357938ace7f44a49b6 100644 (file)
@@ -435,7 +435,10 @@ AC_CHECK_DECLS([reallocarray],[],[],
                [#define _GNU_SOURCE
                 #include <stdlib.h>])
 
-AC_CHECK_FUNCS([process_vm_readv])
+AC_CHECK_FUNCS([process_vm_readv mremap])
+
+AS_IF([test "x$ac_cv_func_mremap" = "xno"],
+      [AC_MSG_WARN([elf_update needs mremap to support ELF_C_RDWR_MMAP])])
 
 AC_CHECK_HEADERS([error.h])
 AC_CHECK_HEADERS([err.h])
index 985f795df88152bdb827705dbbce5963807c9e03..00d4ac0f12cfaefe8405db663928cb24fc3ddd15 100644 (file)
@@ -1,3 +1,7 @@
+2022-04-24  Mark Wielaard  <mark@klomp.org>
+
+       * elf_update.c (write_file): Check HAVE_MREMAP.
+
 2022-04-01  Mark Wielaard  <mark@klomp.org>
 
        * libelfP.h (struct Elf_Data_Chunk): Add an int64_t offset field.
index 9b8867ce7680000fd31e8bd14fb009c9b501803a..97ca9ca943e2dcc70ca985cec2eaf97d8333d78c 100644 (file)
@@ -106,8 +106,10 @@ write_file (Elf *elf, int64_t size, int change_bo, size_t shnum)
          if (elf->cmd == ELF_C_RDWR_MMAP
              && (size_t) size > elf->maximum_size)
            {
+#ifdef HAVE_MREMAP
              if (mremap (elf->map_address, elf->maximum_size,
                          size, 0) == MAP_FAILED)
+#endif
                {
                  __libelf_seterrno (ELF_E_WRITE_ERROR);
                  return -1;