diff mbox

build failure with VDSO on non-glibc based systems

Message ID 55893659.80607@arm.com (mailing list archive)
State New, archived
Headers show

Commit Message

Szabolcs Nagy June 23, 2015, 10:35 a.m. UTC
if the host toolchain is not glibc based then the arm kernel build fails with

 arch/arm/vdso/vdsomunge.c:53:19: fatal error: error.h: No such file or directory

error.h is a glibc only header (ie not available in musl, newlib and bsd libcs).

i attached a patch that fixes the build failure for me.

Comments

Nathan Lynch June 23, 2015, 3:16 p.m. UTC | #1
On 06/23/2015 05:35 AM, Szabolcs Nagy wrote:
> if the host toolchain is not glibc based then the arm kernel build fails with
> 
>  arch/arm/vdso/vdsomunge.c:53:19: fatal error: error.h: No such file or directory
> 
> error.h is a glibc only header (ie not available in musl, newlib and bsd libcs).

Thanks for the report and the patch.  I agree it is inappropriate to
unnecessarily depend on glibc features in host programs.


> i attached a patch that fixes the build failure for me.

A few issues with the patch prevent me from accepting it as-is.

The patch lacks the required Signed-off-by: line; see part 11 in
Documentation/SubmittingPatches.

The body of your email would suffice as the commit log; please include
it in the patch itself.


>  
> +#define fail(...) ( \
> +	failed = 1, \
> +	fprintf(stderr, "%s: ", argv0), \
> +	fprintf(stderr, __VA_ARGS__), \
> +	exit(EXIT_FAILURE))
> +

It would be more in keeping with Linux coding style to write this as a
do { ... } while (0) block (Chapter 12 of Documentation/CodingStyle).

Writing it as a function, if possible, would be best.

Please attend to these issues and resubmit.  Alternatively, I have a
musl installation I can test with and develop an equivalent fix
(crediting you with the initial report, of course).
diff mbox

Patch

From eadb138f144e70ba463077340049e071e212e136 Mon Sep 17 00:00:00 2001
From: Szabolcs Nagy <nsz@port70.net>
Date: Tue, 23 Jun 2015 11:04:16 +0100
Subject: [PATCH] fix arm vdsomunge not to depend on glibc specific error.h

---
 arch/arm/vdso/vdsomunge.c |   49 ++++++++++++++++++++++++---------------------
 1 file changed, 26 insertions(+), 23 deletions(-)

diff --git a/arch/arm/vdso/vdsomunge.c b/arch/arm/vdso/vdsomunge.c
index 9005b07..9a1a74d 100644
--- a/arch/arm/vdso/vdsomunge.c
+++ b/arch/arm/vdso/vdsomunge.c
@@ -45,12 +45,9 @@ 
  * it does.
  */
 
-#define _GNU_SOURCE
-
 #include <byteswap.h>
 #include <elf.h>
 #include <errno.h>
-#include <error.h>
 #include <fcntl.h>
 #include <stdbool.h>
 #include <stdio.h>
@@ -82,11 +79,19 @@ 
 #define EF_ARM_ABI_FLOAT_HARD 0x400
 #endif
 
+#define fail(...) ( \
+	failed = 1, \
+	fprintf(stderr, "%s: ", argv0), \
+	fprintf(stderr, __VA_ARGS__), \
+	exit(EXIT_FAILURE))
+
+static int failed;
+static const char *argv0;
 static const char *outfile;
 
 static void cleanup(void)
 {
-	if (error_message_count > 0 && outfile != NULL)
+	if (failed && outfile != NULL)
 		unlink(outfile);
 }
 
@@ -119,68 +124,66 @@  int main(int argc, char **argv)
 	int infd;
 
 	atexit(cleanup);
+	argv0 = argv[0];
 
 	if (argc != 3)
-		error(EXIT_FAILURE, 0, "Usage: %s [infile] [outfile]", argv[0]);
+		fail("Usage: %s [infile] [outfile]\n", argv[0]);
 
 	infile = argv[1];
 	outfile = argv[2];
 
 	infd = open(infile, O_RDONLY);
 	if (infd < 0)
-		error(EXIT_FAILURE, errno, "Cannot open %s", infile);
+		fail("Cannot open %s: %s\n", infile, strerror(errno));
 
 	if (fstat(infd, &stat) != 0)
-		error(EXIT_FAILURE, errno, "Failed stat for %s", infile);
+		fail("Failed stat for %s: %s\n", infile, strerror(errno));
 
 	inbuf = mmap(NULL, stat.st_size, PROT_READ, MAP_PRIVATE, infd, 0);
 	if (inbuf == MAP_FAILED)
-		error(EXIT_FAILURE, errno, "Failed to map %s", infile);
+		fail("Failed to map %s: %s\n", infile, strerror(errno));
 
 	close(infd);
 
 	inhdr = inbuf;
 
 	if (memcmp(&inhdr->e_ident, ELFMAG, SELFMAG) != 0)
-		error(EXIT_FAILURE, 0, "Not an ELF file");
+		fail("Not an ELF file\n");
 
 	if (inhdr->e_ident[EI_CLASS] != ELFCLASS32)
-		error(EXIT_FAILURE, 0, "Unsupported ELF class");
+		fail("Unsupported ELF class\n");
 
 	swap = inhdr->e_ident[EI_DATA] != HOST_ORDER;
 
 	if (read_elf_half(inhdr->e_type, swap) != ET_DYN)
-		error(EXIT_FAILURE, 0, "Not a shared object");
+		fail("Not a shared object\n");
 
-	if (read_elf_half(inhdr->e_machine, swap) != EM_ARM) {
-		error(EXIT_FAILURE, 0, "Unsupported architecture %#x",
-		      inhdr->e_machine);
-	}
+	if (read_elf_half(inhdr->e_machine, swap) != EM_ARM)
+		fail("Unsupported architecture %#x\n", inhdr->e_machine);
 
 	e_flags = read_elf_word(inhdr->e_flags, swap);
 
 	if (EF_ARM_EABI_VERSION(e_flags) != EF_ARM_EABI_VER5) {
-		error(EXIT_FAILURE, 0, "Unsupported EABI version %#x",
-		      EF_ARM_EABI_VERSION(e_flags));
+		fail("Unsupported EABI version %#x\n",
+		     EF_ARM_EABI_VERSION(e_flags));
 	}
 
 	if (e_flags & EF_ARM_ABI_FLOAT_HARD)
-		error(EXIT_FAILURE, 0,
-		      "Unexpected hard-float flag set in e_flags");
+		fail("Unexpected hard-float flag set in e_flags\n");
 
 	clear_soft_float = !!(e_flags & EF_ARM_ABI_FLOAT_SOFT);
 
 	outfd = open(outfile, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
 	if (outfd < 0)
-		error(EXIT_FAILURE, errno, "Cannot open %s", outfile);
+		fail("Cannot open %s: %s\n", outfile, strerror(errno));
 
 	if (ftruncate(outfd, stat.st_size) != 0)
-		error(EXIT_FAILURE, errno, "Cannot truncate %s", outfile);
+		fail("Cannot truncate %s: %s\n", outfile, strerror(errno));
 
 	outbuf = mmap(NULL, stat.st_size, PROT_READ | PROT_WRITE, MAP_SHARED,
 		      outfd, 0);
 	if (outbuf == MAP_FAILED)
-		error(EXIT_FAILURE, errno, "Failed to map %s", outfile);
+		fail("Failed to map %s: %s\n", outfile, strerror(errno));
 
 	close(outfd);
 
@@ -195,7 +198,7 @@  int main(int argc, char **argv)
 	}
 
 	if (msync(outbuf, stat.st_size, MS_SYNC) != 0)
-		error(EXIT_FAILURE, errno, "Failed to sync %s", outfile);
+		fail("Failed to sync %s: %s\n", outfile, strerror(errno));
 
 	return EXIT_SUCCESS;
 }
-- 
1.7.9.5