Re: [PATCH] Check for existence of mempcpy

2017-02-17 Thread Ulf Hermann

> If at all possible I would like elfutils to not turn into some
> abstraction layer for broken non-GNU/Linux systems. I don't mind small
> (mostly) obvious correct defines/checks or tweaks to help out people
> using such broken systems. But if we need a lot more of these things I
> think we should look if we can just import the necessary gnulib modules
> to get portability functions.

I've actually done that, but the amount of stuff that would need to be imported 
is staggering (see for example https://codereview.qt-project.org/#/c/182654/13) 
and comes with a serious mess of different licenses.

I've since switched to a different strategy where I rather disable features 
than import large gnulib modules. Disabling maintainer mode (for obstack) and 
any code that uses argp certainly helps. The remaining pain point is 
tsearch/tfind/tdelete/tdestroy for which we probably need third party code. 
Another problem is that we need fts for dwfl_linux_kernel_*. I'm on the edge on 
whether to include the gnulib implementation or disable it.

The retrying I/O functions can be implemented on top of either Linux/GNU or 
windows API and I would just move them to a separate file which I can replace 
based on availability of one or the other (I don't need to upstream the windows 
implementation). This technique will require universally using the retrying 
variants rather than the plain ones, which is a good thing anyway.

Replacements for mmap() and dlopen() on windows are a somewhat more involved 
matter but I don't really need to upstream them either, if you don't want them.

All other missing functions are just a few lines of C code each, which can 
either be pulled from gnulib or reimplemented. As I didn't want to taint myself 
with license problems I chose to reimplement them for now. But that can be 
decided on a case by case basis. Those are the patches I'm going to focus on 
next.

And then there are nonstandard C constructs, especially void* arithmetics and 
statement expressions, which I would like to replace with standards compliant 
C. That is a somewhat larger and not yet finished project, and I'm hoping 
you're generally open to it.

cheers,
Ulf


[PATCH] Check for existence of mempcpy

2017-02-16 Thread Ulf Hermann
If it doesn't exist, provide a definition based on memcpy.

Signed-off-by: Ulf Hermann 
---
 ChangeLog  | 4 
 configure.ac   | 3 +++
 lib/ChangeLog  | 5 +
 lib/system.h   | 5 +
 lib/xstrndup.c | 2 +-
 libasm/ChangeLog   | 4 
 libasm/disasm_str.c| 2 +-
 libdwfl/ChangeLog  | 4 
 libdwfl/linux-kernel-modules.c | 1 +
 libebl/ChangeLog   | 5 +
 libebl/eblmachineflagname.c| 1 +
 libebl/eblopenbackend.c| 1 +
 tests/ChangeLog| 4 
 tests/elfstrmerge.c| 1 +
 14 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index b50f79e..48185c3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2017-02-15  Ulf Hermann  
+
+   * configure.ac: Add check for mempcpy.
+
 2017-02-09  Mark Wielaard  
 
* configure.ac: Add check for adding -D_FORTIFY_SOURCE=2 to CFLAGS.
diff --git a/configure.ac b/configure.ac
index 46055f2..3c35dac 100644
--- a/configure.ac
+++ b/configure.ac
@@ -285,6 +285,9 @@ AC_CHECK_DECLS([memrchr, rawmemchr],[],[],
[#define _GNU_SOURCE
 #include ])
 AC_CHECK_DECLS([powerof2],[],[],[#include ])
+AC_CHECK_DECLS([mempcpy],[],[],
+   [#define _GNU_SOURCE
+#include ])
 
 AC_CHECK_LIB([stdc++], [__cxa_demangle], [dnl
 AC_DEFINE([USE_DEMANGLE], [1], [Defined if demangling is enabled])])
diff --git a/lib/ChangeLog b/lib/ChangeLog
index 6578ddb..fd63e03 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,5 +1,10 @@
 2017-02-15  Ulf Hermann  
 
+   * system.h: Provide mempcpy if it doesn't exist.
+   * xstrndup.c: Include system.h.
+
+2017-02-15  Ulf Hermann  
+
* crc32_file.c: Use _SC_PAGESIZE rather than _SC_PAGE_SIZE.
 
 2017-02-14  Ulf Hermann  
diff --git a/lib/system.h b/lib/system.h
index dde7c4a..429b0c3 100644
--- a/lib/system.h
+++ b/lib/system.h
@@ -68,6 +68,11 @@
 #define powerof2(x) (((x) & ((x) - 1)) == 0)
 #endif
 
+#if !HAVE_DECL_MEMPCPY
+#define mempcpy(dest, src, n) \
+((void *) ((char *) memcpy (dest, src, n) + (size_t) n))
+#endif
+
 /* A special gettext function we use if the strings are too short.  */
 #define sgettext(Str) \
   ({ const char *__res = strrchr (gettext (Str), '|');   \
diff --git a/lib/xstrndup.c b/lib/xstrndup.c
index d43e3b9..a257aa9 100644
--- a/lib/xstrndup.c
+++ b/lib/xstrndup.c
@@ -33,7 +33,7 @@
 #include 
 #include 
 #include "libeu.h"
-
+#include "system.h"
 
 /* Return a newly allocated copy of STRING.  */
 char *
diff --git a/libasm/ChangeLog b/libasm/ChangeLog
index fe06007..26fc5a9 100644
--- a/libasm/ChangeLog
+++ b/libasm/ChangeLog
@@ -1,3 +1,7 @@
+2017-02-15  Ulf Hermann  
+
+   * disasm_str.c: Include system.h.
+
 2015-10-11  Akihiko Odaki  
 
* asm_align.c: Remove sys/param.h include.
diff --git a/libasm/disasm_str.c b/libasm/disasm_str.c
index 5b0bb29..c14e6d5 100644
--- a/libasm/disasm_str.c
+++ b/libasm/disasm_str.c
@@ -31,7 +31,7 @@
 #endif
 
 #include 
-
+#include 
 #include "libasmP.h"
 
 
diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog
index 52466cc..4c9f4f6 100644
--- a/libdwfl/ChangeLog
+++ b/libdwfl/ChangeLog
@@ -1,5 +1,9 @@
 2017-02-15  Ulf Hermann  
 
+   * linux-kernel-modules.c: Include system.h.
+
+2017-02-15  Ulf Hermann  
+
* linux-kernel-modules.c: Use sysconf(_SC_PAGESIZE) to get page size.
* linux-proc-maps.c: Likewise.
 
diff --git a/libdwfl/linux-kernel-modules.c b/libdwfl/linux-kernel-modules.c
index a7ac19d..7345e76 100644
--- a/libdwfl/linux-kernel-modules.c
+++ b/libdwfl/linux-kernel-modules.c
@@ -34,6 +34,7 @@
 #endif
 
 #include 
+#include 
 
 #include "libdwflP.h"
 #include 
diff --git a/libebl/ChangeLog b/libebl/ChangeLog
index 0560c6a..719d08d 100644
--- a/libebl/ChangeLog
+++ b/libebl/ChangeLog
@@ -1,3 +1,8 @@
+2017-02-15  Ulf Hermann  
+
+   * eblmachineflagname.c: Include system.h.
+   * eblopenbackend.c: Likewise.
+
 2016-07-08  Mark Wielaard  
 
* Makefile.am (gen_SOURCES): Remove eblstrtab.c.
diff --git a/libebl/eblmachineflagname.c b/libebl/eblmachineflagname.c
index 6079a61..5f44077 100644
--- a/libebl/eblmachineflagname.c
+++ b/libebl/eblmachineflagname.c
@@ -33,6 +33,7 @@
 
 #include 
 #include 
+#include 
 #include 
 
 
diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c
index aa75b95..f3a65cf 100644
--- a/libebl/eblopenbackend.c
+++ b/libebl/eblopenbackend.c
@@ -39,6 +39,7 @@
 #include 
 #include 
 
+#include 
 #include 
 
 
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 71dba42..4af450c 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,7 @@
+2017-02-15  Ulf Hermann