libctf: make it compile for old glibc
authorHans-Peter Nilsson <hp@bitrange.com>
Thu, 11 Jul 2019 04:11:09 +0000 (00:11 -0400)
committerNick Alcock <nick.alcock@oracle.com>
Thu, 3 Oct 2019 16:04:55 +0000 (17:04 +0100)
With a glibc before 2.9 (such as 2.8), there's <endian.h> but no
htole64 or le64toh, so you get, compiling binutils for any target:

libtool: link: gcc -W -Wall -Wstrict-prototypes -Wmissing-prototypes \
-Wshadow -Werror -I/x/binutils/../zlib -g -O2 -o objdump \
objdump.o dwarf.o prdbg.o rddbg.o debug.o stabs.o rdcoff.o \
bucomm.o version.o filemode.o elfcomm.o  ../opcodes/.libs/libopcodes.a \
../libctf/libctf.a ../bfd/.libs/libbfd.a -L/x/obj/b/zlib -lz ../libiberty/libiberty.a -ldl
../libctf/libctf.a(ctf-archive.o): In function `ctf_archive_raw_iter_internal':
/x/src/libctf/ctf-archive.c:543: undefined reference to `le64toh'
/x/src/libctf/ctf-archive.c:550: undefined reference to `le64toh'
/x/src/libctf/ctf-archive.c:551: undefined reference to `le64toh'
/x/src/libctf/ctf-archive.c:551: undefined reference to `le64toh'
/x/src/libctf/ctf-archive.c:554: undefined reference to `le64toh'
../libctf/libctf.a(ctf-archive.o):/x/src/libctf/ctf-archive.c:545: more undefined references to `le64toh' follow
(etc)

Also, I see no bswap_identity_64 *anywhere* except in libctf/swap.h
(including current glibc) and I don't think calling an "identity"-
function is better than just plain "#define foo(x) (x)" anyway.
(Where does the idea of a bytestap.h bswap_identity_64 come from?)

Speaking of that, I should mention that I instrumented the condition
to observe that the WORDS_BIGENDIAN case passes too for a presumed
big-endian target and glibc-2.8: there is a bswap_64 present for that
version.  Curiously, no test-case regressed with that instrumentation.

For the record, constructing binary blobs using text source to run
tests on, can be done by linking to --oformat binary (with most ELF
targets), but I guess that's seen as unnecessary roundabout perhaps
checking in binary files in the test-suite would be ok these days.
[...]

[nca: trimmed commit log slightly, updated changelog]

v5: fix tabdamage.

libctf/
* ctf-endian.h: Don't assume htole64 and le64toh are always
present if HAVE_ENDIAN_H; also check if htole64 is defined.
[!WORDS_BIGENDIAN] (htole64, le64toh): Define as identity,
not bswap_identity_64.

libctf/ChangeLog
libctf/ctf-endian.h

index 8a82ed0565f82f6176f6e818c74de0bc651ea678..08eb02bea01d33afea2f42cde0460216a79b19fc 100644 (file)
@@ -1,3 +1,10 @@
+2019-07-11  Hans-Peter Nilsson  <hp@bitrange.com>
+
+       * ctf-endian.h: Don't assume htole64 and le64toh are always
+       present if HAVE_ENDIAN_H; also check if htole64 is defined.
+       [!WORDS_BIGENDIAN] (htole64, le64toh): Define as identity,
+       not bswap_identity_64.
+
 2019-09-18  Alan Modra  <amodra@gmail.com>
 
        * ctf-open-bfd.c: Update throughout for bfd section macro changes.
index ec177d1bdd816e4a56a406519b923bfbfaae8243..f1cc527a080572a69210ec82536db7231fe3014f 100644 (file)
 #include <stdint.h>
 #include "swap.h"
 
-#ifndef HAVE_ENDIAN_H
+#if !defined (HAVE_ENDIAN_H) || !defined (htole64)
 #ifndef WORDS_BIGENDIAN
-# define htole64(x) bswap_identity_64 ((x))
-# define le64toh(x) bswap_identity_64 ((x))
+# define htole64(x) (x)
+# define le64toh(x) (x)
 #else
 # define htole64(x) bswap_64 ((x))
 # define le64toh(x) bswap_64 ((x))