From 3249e23ea9e28f674892a2b8b4e64dcb568e996a Mon Sep 17 00:00:00 2001
From: Kevin Mihelich <kevin@archlinuxarm.org>
Date: Wed, 21 Jul 2021 21:37:31 -0600
Subject: [PATCH 3/3] Fix eu-strip build for newer GCC

---
 .../third_party/eu-strip/0001-gcc-fixes.patch | 656 ++++++++++++++++++
 buildtools/third_party/eu-strip/build.sh      |   3 +-
 2 files changed, 658 insertions(+), 1 deletion(-)
 create mode 100644 buildtools/third_party/eu-strip/0001-gcc-fixes.patch

diff --git a/buildtools/third_party/eu-strip/0001-gcc-fixes.patch b/buildtools/third_party/eu-strip/0001-gcc-fixes.patch
new file mode 100644
index 0000000000000..14f45f2662938
--- /dev/null
+++ b/buildtools/third_party/eu-strip/0001-gcc-fixes.patch
@@ -0,0 +1,656 @@
+From 62350f68539357e15fe7f6e1ec35be36af63fe43 Mon Sep 17 00:00:00 2001
+From: Kevin Mihelich <kevin@archlinuxarm.org>
+Date: Thu, 17 Feb 2022 19:58:58 -0700
+Subject: [PATCH] gcc fixes
+
+---
+ backends/Makefile.am         |  8 ++---
+ backends/i386_init.c         |  1 -
+ backends/i386_syscall.c      | 50 ---------------------------
+ backends/linux-core-note.c   |  2 +-
+ backends/ppc64_init.c        |  1 -
+ backends/ppc_init.c          |  1 -
+ backends/ppc_syscall.c       | 53 -----------------------------
+ backends/x86_64_init.c       |  1 -
+ backends/x86_64_syscall.c    | 50 ---------------------------
+ libdw/dwarf_frame_register.c |  2 +-
+ libdw/libdw.h                |  8 +++--
+ libebl/Makefile.am           |  2 +-
+ libebl/ebl-hooks.h           |  4 ---
+ libebl/ebl_syscall_abi.c     | 40 ----------------------
+ libebl/eblopenbackend.c      | 17 ----------
+ libebl/libebl.h              |  8 -----
+ libelf/libelfP.h             |  4 +--
+ src/ar.c                     | 66 +++++++++++++++++++++++++-----------
+ src/elflint.c                |  2 +-
+ tests/addrcfi.c              |  2 +-
+ 20 files changed, 62 insertions(+), 260 deletions(-)
+ delete mode 100644 backends/i386_syscall.c
+ delete mode 100644 backends/ppc_syscall.c
+ delete mode 100644 backends/x86_64_syscall.c
+ delete mode 100644 libebl/ebl_syscall_abi.c
+
+diff --git a/backends/Makefile.am b/backends/Makefile.am
+index 37dc2d20..b554894d 100644
+--- a/backends/Makefile.am
++++ b/backends/Makefile.am
+@@ -48,7 +48,7 @@ libdw = ../libdw/libdw.so
+ libeu = ../lib/libeu.a
+ 
+ i386_SRCS = i386_init.c i386_symbol.c i386_corenote.c i386_cfi.c \
+-	    i386_retval.c i386_regs.c i386_auxv.c i386_syscall.c \
++	    i386_retval.c i386_regs.c i386_auxv.c \
+ 	    i386_initreg.c i386_unwind.c
+ cpu_i386 = ../libcpu/libcpu_i386.a
+ libebl_i386_pic_a_SOURCES = $(i386_SRCS)
+@@ -59,7 +59,7 @@ libebl_sh_pic_a_SOURCES = $(sh_SRCS)
+ am_libebl_sh_pic_a_OBJECTS = $(sh_SRCS:.c=.os)
+ 
+ x86_64_SRCS = x86_64_init.c x86_64_symbol.c x86_64_corenote.c x86_64_cfi.c \
+-	      x86_64_retval.c x86_64_regs.c i386_auxv.c x86_64_syscall.c \
++	      x86_64_retval.c x86_64_regs.c i386_auxv.c \
+ 	      x86_64_initreg.c x86_64_unwind.c x32_corenote.c
+ cpu_x86_64 = ../libcpu/libcpu_x86_64.a
+ libebl_x86_64_pic_a_SOURCES = $(x86_64_SRCS)
+@@ -92,13 +92,13 @@ libebl_sparc_pic_a_SOURCES = $(sparc_SRCS)
+ am_libebl_sparc_pic_a_OBJECTS = $(sparc_SRCS:.c=.os)
+ 
+ ppc_SRCS = ppc_init.c ppc_symbol.c ppc_retval.c ppc_regs.c \
+-	   ppc_corenote.c ppc_auxv.c ppc_attrs.c ppc_syscall.c \
++	   ppc_corenote.c ppc_auxv.c ppc_attrs.c \
+ 	   ppc_cfi.c ppc_initreg.c
+ libebl_ppc_pic_a_SOURCES = $(ppc_SRCS)
+ am_libebl_ppc_pic_a_OBJECTS = $(ppc_SRCS:.c=.os)
+ 
+ ppc64_SRCS = ppc64_init.c ppc64_symbol.c ppc64_retval.c \
+-	     ppc64_corenote.c ppc_regs.c ppc_auxv.c ppc_attrs.c ppc_syscall.c \
++	     ppc64_corenote.c ppc_regs.c ppc_auxv.c ppc_attrs.c \
+ 	     ppc_cfi.c ppc_initreg.c ppc64_unwind.c ppc64_resolve_sym.c
+ libebl_ppc64_pic_a_SOURCES = $(ppc64_SRCS)
+ am_libebl_ppc64_pic_a_OBJECTS = $(ppc64_SRCS:.c=.os)
+diff --git a/backends/i386_init.c b/backends/i386_init.c
+index fc1587a9..847a11c0 100644
+--- a/backends/i386_init.c
++++ b/backends/i386_init.c
+@@ -58,7 +58,6 @@ i386_init (Elf *elf __attribute__ ((unused)),
+   HOOK (eh, debugscn_p);
+   HOOK (eh, return_value_location);
+   HOOK (eh, register_info);
+-  HOOK (eh, syscall_abi);
+   HOOK (eh, auxv_info);
+   HOOK (eh, disasm);
+   HOOK (eh, abi_cfi);
+diff --git a/backends/i386_syscall.c b/backends/i386_syscall.c
+deleted file mode 100644
+index 535dcd86..00000000
+--- a/backends/i386_syscall.c
++++ /dev/null
+@@ -1,50 +0,0 @@
+-/* Linux/i386 system call ABI in DWARF register numbers.
+-   Copyright (C) 2008 Red Hat, Inc.
+-   This file is part of elfutils.
+-
+-   This file is free software; you can redistribute it and/or modify
+-   it under the terms of either
+-
+-     * the GNU Lesser General Public License as published by the Free
+-       Software Foundation; either version 3 of the License, or (at
+-       your option) any later version
+-
+-   or
+-
+-     * the GNU General Public License as published by the Free
+-       Software Foundation; either version 2 of the License, or (at
+-       your option) any later version
+-
+-   or both in parallel, as here.
+-
+-   elfutils is distributed in the hope that it will be useful, but
+-   WITHOUT ANY WARRANTY; without even the implied warranty of
+-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-   General Public License for more details.
+-
+-   You should have received copies of the GNU General Public License and
+-   the GNU Lesser General Public License along with this program.  If
+-   not, see <http://www.gnu.org/licenses/>.  */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#define BACKEND i386_
+-#include "libebl_CPU.h"
+-
+-int
+-i386_syscall_abi (Ebl *ebl __attribute__ ((unused)),
+-		  int *sp, int *pc, int *callno, int args[6])
+-{
+-  *sp = 4;			/* %esp */
+-  *pc = 8;			/* %eip */
+-  *callno = 0;			/* %eax */
+-  args[0] = 3;			/* %ebx */
+-  args[1] = 1;			/* %ecx */
+-  args[2] = 2;			/* %edx */
+-  args[3] = 6;			/* %esi */
+-  args[4] = 7;			/* %edi */
+-  args[5] = 5;			/* %ebp */
+-  return 0;
+-}
+diff --git a/backends/linux-core-note.c b/backends/linux-core-note.c
+index 67638d70..08282ba4 100644
+--- a/backends/linux-core-note.c
++++ b/backends/linux-core-note.c
+@@ -111,7 +111,7 @@ struct EBLHOOK(prstatus)
+   FIELD (INT, pr_fpvalid);
+ }
+ #ifdef ALIGN_PRSTATUS
+-  __attribute__ ((packed, aligned (ALIGN_PRSTATUS)))
++  attribute_packed __attribute__ ((aligned (ALIGN_PRSTATUS)))
+ #endif
+ ;
+ 
+diff --git a/backends/ppc64_init.c b/backends/ppc64_init.c
+index e5670338..ec36498c 100644
+--- a/backends/ppc64_init.c
++++ b/backends/ppc64_init.c
+@@ -64,7 +64,6 @@ ppc64_init (Elf *elf __attribute__ ((unused)),
+   HOOK (eh, bss_plt_p);
+   HOOK (eh, return_value_location);
+   HOOK (eh, register_info);
+-  HOOK (eh, syscall_abi);
+   HOOK (eh, core_note);
+   HOOK (eh, auxv_info);
+   HOOK (eh, check_object_attribute);
+diff --git a/backends/ppc_init.c b/backends/ppc_init.c
+index aea9f2d7..ab0a00c7 100644
+--- a/backends/ppc_init.c
++++ b/backends/ppc_init.c
+@@ -60,7 +60,6 @@ ppc_init (Elf *elf __attribute__ ((unused)),
+   HOOK (eh, bss_plt_p);
+   HOOK (eh, return_value_location);
+   HOOK (eh, register_info);
+-  HOOK (eh, syscall_abi);
+   HOOK (eh, core_note);
+   HOOK (eh, auxv_info);
+   HOOK (eh, check_object_attribute);
+diff --git a/backends/ppc_syscall.c b/backends/ppc_syscall.c
+deleted file mode 100644
+index b1b9c52b..00000000
+--- a/backends/ppc_syscall.c
++++ /dev/null
+@@ -1,53 +0,0 @@
+-/* Linux/PPC system call ABI in DWARF register numbers.
+-   Copyright (C) 2008 Red Hat, Inc.
+-   This file is part of elfutils.
+-
+-   This file is free software; you can redistribute it and/or modify
+-   it under the terms of either
+-
+-     * the GNU Lesser General Public License as published by the Free
+-       Software Foundation; either version 3 of the License, or (at
+-       your option) any later version
+-
+-   or
+-
+-     * the GNU General Public License as published by the Free
+-       Software Foundation; either version 2 of the License, or (at
+-       your option) any later version
+-
+-   or both in parallel, as here.
+-
+-   elfutils is distributed in the hope that it will be useful, but
+-   WITHOUT ANY WARRANTY; without even the implied warranty of
+-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-   General Public License for more details.
+-
+-   You should have received copies of the GNU General Public License and
+-   the GNU Lesser General Public License along with this program.  If
+-   not, see <http://www.gnu.org/licenses/>.  */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#define BACKEND ppc_
+-#include "libebl_CPU.h"
+-
+-int
+-ppc_syscall_abi (Ebl *ebl __attribute__ ((unused)),
+-		 int *sp, int *pc, int *callno, int args[6])
+-{
+-  *sp = 1;
+-  *pc = -1;
+-  *callno = 0;
+-  args[0] = 3;
+-  args[1] = 4;
+-  args[2] = 5;
+-  args[3] = 6;
+-  args[4] = 7;
+-  args[5] = 8;
+-  return 0;
+-}
+-
+-__typeof (ppc_syscall_abi)
+-ppc64_syscall_abi __attribute__ ((alias ("ppc_syscall_abi")));
+diff --git a/backends/x86_64_init.c b/backends/x86_64_init.c
+index adfa4791..a3838b69 100644
+--- a/backends/x86_64_init.c
++++ b/backends/x86_64_init.c
+@@ -61,7 +61,6 @@ x86_64_init (Elf *elf __attribute__ ((unused)),
+     HOOK (eh, core_note);
+   HOOK (eh, return_value_location);
+   HOOK (eh, register_info);
+-  HOOK (eh, syscall_abi);
+   HOOK (eh, auxv_info);
+   HOOK (eh, disasm);
+   HOOK (eh, abi_cfi);
+diff --git a/backends/x86_64_syscall.c b/backends/x86_64_syscall.c
+deleted file mode 100644
+index 0deb8bad..00000000
+--- a/backends/x86_64_syscall.c
++++ /dev/null
+@@ -1,50 +0,0 @@
+-/* Linux/x86-64 system call ABI in DWARF register numbers.
+-   Copyright (C) 2008 Red Hat, Inc.
+-   This file is part of elfutils.
+-
+-   This file is free software; you can redistribute it and/or modify
+-   it under the terms of either
+-
+-     * the GNU Lesser General Public License as published by the Free
+-       Software Foundation; either version 3 of the License, or (at
+-       your option) any later version
+-
+-   or
+-
+-     * the GNU General Public License as published by the Free
+-       Software Foundation; either version 2 of the License, or (at
+-       your option) any later version
+-
+-   or both in parallel, as here.
+-
+-   elfutils is distributed in the hope that it will be useful, but
+-   WITHOUT ANY WARRANTY; without even the implied warranty of
+-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-   General Public License for more details.
+-
+-   You should have received copies of the GNU General Public License and
+-   the GNU Lesser General Public License along with this program.  If
+-   not, see <http://www.gnu.org/licenses/>.  */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#define BACKEND x86_64_
+-#include "libebl_CPU.h"
+-
+-int
+-x86_64_syscall_abi (Ebl *ebl __attribute__ ((unused)),
+-		    int *sp, int *pc, int *callno, int args[6])
+-{
+-  *sp = 7;			/* %rsp */
+-  *pc = 16;			/* %rip */
+-  *callno = 0;			/* %rax */
+-  args[0] = 5;			/* %rdi */
+-  args[1] = 4;			/* %rsi */
+-  args[2] = 1;			/* %rdx */
+-  args[3] = 10;			/* %r10 */
+-  args[4] = 8;			/* %r8 */
+-  args[5] = 9;			/* %r9 */
+-  return 0;
+-}
+diff --git a/libdw/dwarf_frame_register.c b/libdw/dwarf_frame_register.c
+index 37e8e917..5b5b1e33 100644
+--- a/libdw/dwarf_frame_register.c
++++ b/libdw/dwarf_frame_register.c
+@@ -34,7 +34,7 @@
+ #include <dwarf.h>
+ 
+ int
+-dwarf_frame_register (Dwarf_Frame *fs, int regno, Dwarf_Op *ops_mem,
++dwarf_frame_register (Dwarf_Frame *fs, int regno, Dwarf_Op ops_mem[3],
+ 		      Dwarf_Op **ops, size_t *nops)
+ {
+   /* Maybe there was a previous error.  */
+diff --git a/libdw/libdw.h b/libdw/libdw.h
+index 63a38ff9..75fcbd9d 100644
+--- a/libdw/libdw.h
++++ b/libdw/libdw.h
+@@ -977,9 +977,11 @@ extern int dwarf_frame_cfa (Dwarf_Frame *frame, Dwarf_Op **ops, size_t *nops)
+    caller's REGNO is "same_value", i.e. this frame did not change it;
+    ask the caller frame where to find it.
+ 
+-   For common simple expressions *OPS is OPS_MEM.  For arbitrary DWARF
+-   expressions in the CFI, *OPS is an internal pointer that can be used as
+-   long as the Dwarf_CFI used to create FRAME remains alive.  */
++   For common simple expressions *OPS is OPS_MEM (which is a caller
++   owned array for at least 3 Dwarf_Ops).  For arbitrary DWARF
++   expressions in the CFI, *OPS is an internal pointer that can be
++   used as long as the Dwarf_CFI used to create FRAME remains
++   alive.  */
+ extern int dwarf_frame_register (Dwarf_Frame *frame, int regno,
+ 				 Dwarf_Op ops_mem[3],
+ 				 Dwarf_Op **ops, size_t *nops)
+diff --git a/libebl/Makefile.am b/libebl/Makefile.am
+index 2491df80..b58ec11a 100644
+--- a/libebl/Makefile.am
++++ b/libebl/Makefile.am
+@@ -51,7 +51,7 @@ gen_SOURCES = eblopenbackend.c eblclosebackend.c \
+ 	      ebl_check_special_symbol.c eblbsspltp.c eblretval.c \
+ 	      eblreginfo.c eblnonerelocp.c eblrelativerelocp.c \
+ 	      eblsysvhashentrysize.c eblauxvinfo.c eblcheckobjattr.c \
+-	      ebl_check_special_section.c ebl_syscall_abi.c eblabicfi.c \
++	      ebl_check_special_section.c eblabicfi.c \
+ 	      eblstother.c eblinitreg.c ebldwarftoregno.c eblnormalizepc.c \
+ 	      eblunwind.c eblresolvesym.c eblcheckreloctargettype.c \
+ 	      ebl_data_marker_symbol.c
+diff --git a/libebl/ebl-hooks.h b/libebl/ebl-hooks.h
+index f3a0e64a..5c85289d 100644
+--- a/libebl/ebl-hooks.h
++++ b/libebl/ebl-hooks.h
+@@ -142,10 +142,6 @@ ssize_t EBLHOOK(register_info) (Ebl *ebl,
+ 				const char **prefix, const char **setname,
+ 				int *bits, int *type);
+ 
+-/* Return system call ABI registers.  */
+-int EBLHOOK(syscall_abi) (Ebl *ebl, int *sp, int *pc,
+-			  int *callno, int args[6]);
+-
+ /* Disassembler function.  */
+ int EBLHOOK(disasm) (Ebl *ebl, const uint8_t **startp, const uint8_t *end,
+ 		     GElf_Addr addr, const char *fmt, DisasmOutputCB_t outcb,
+diff --git a/libebl/ebl_syscall_abi.c b/libebl/ebl_syscall_abi.c
+deleted file mode 100644
+index a25369d2..00000000
+--- a/libebl/ebl_syscall_abi.c
++++ /dev/null
+@@ -1,40 +0,0 @@
+-/* Return system call ABI mapped to DWARF register numbers.
+-   Copyright (C) 2008 Red Hat, Inc.
+-   This file is part of elfutils.
+-
+-   This file is free software; you can redistribute it and/or modify
+-   it under the terms of either
+-
+-     * the GNU Lesser General Public License as published by the Free
+-       Software Foundation; either version 3 of the License, or (at
+-       your option) any later version
+-
+-   or
+-
+-     * the GNU General Public License as published by the Free
+-       Software Foundation; either version 2 of the License, or (at
+-       your option) any later version
+-
+-   or both in parallel, as here.
+-
+-   elfutils is distributed in the hope that it will be useful, but
+-   WITHOUT ANY WARRANTY; without even the implied warranty of
+-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-   General Public License for more details.
+-
+-   You should have received copies of the GNU General Public License and
+-   the GNU Lesser General Public License along with this program.  If
+-   not, see <http://www.gnu.org/licenses/>.  */
+-
+-#ifdef HAVE_CONFIG_H
+-# include <config.h>
+-#endif
+-
+-#include <libeblP.h>
+-
+-
+-int
+-ebl_syscall_abi (Ebl *ebl, int *sp, int *pc, int *callno, int *args)
+-{
+-  return ebl != NULL ? ebl->syscall_abi (ebl, sp, pc, callno, args) : -1;
+-}
+diff --git a/libebl/eblopenbackend.c b/libebl/eblopenbackend.c
+index 1f814776..fbd78e8a 100644
+--- a/libebl/eblopenbackend.c
++++ b/libebl/eblopenbackend.c
+@@ -196,8 +196,6 @@ static ssize_t default_register_info (Ebl *ebl,
+ 				      const char **prefix,
+ 				      const char **setname,
+ 				      int *bits, int *type);
+-static int default_syscall_abi (Ebl *ebl, int *sp, int *pc,
+-				int *callno, int args[6]);
+ static bool default_check_object_attribute (Ebl *ebl, const char *vendor,
+ 					    int tag, uint64_t value,
+ 					    const char **tag_name,
+@@ -241,7 +239,6 @@ fill_defaults (Ebl *result)
+   result->bss_plt_p = default_bss_plt_p;
+   result->return_value_location = default_return_value_location;
+   result->register_info = default_register_info;
+-  result->syscall_abi = default_syscall_abi;
+   result->check_object_attribute = default_check_object_attribute;
+   result->check_reloc_target_type = default_check_reloc_target_type;
+   result->disasm = NULL;
+@@ -717,20 +714,6 @@ default_register_info (Ebl *ebl __attribute__ ((unused)),
+   return snprintf (name, namelen, "reg%d", regno);
+ }
+ 
+-static int
+-default_syscall_abi (Ebl *ebl __attribute__ ((unused)),
+-		     int *sp, int *pc, int *callno, int args[6])
+-{
+-  *sp = *pc = *callno = -1;
+-  args[0] = -1;
+-  args[1] = -1;
+-  args[2] = -1;
+-  args[3] = -1;
+-  args[4] = -1;
+-  args[5] = -1;
+-  return -1;
+-}
+-
+ static bool
+ default_check_object_attribute (Ebl *ebl __attribute__ ((unused)),
+ 				const char *vendor  __attribute__ ((unused)),
+diff --git a/libebl/libebl.h b/libebl/libebl.h
+index 882bdb99..5200b934 100644
+--- a/libebl/libebl.h
++++ b/libebl/libebl.h
+@@ -243,14 +243,6 @@ extern ssize_t ebl_register_info (Ebl *ebl,
+ 				  const char **prefix, const char **setname,
+ 				  int *bits, int *type);
+ 
+-/* Fill in the DWARF register numbers for the registers used in system calls.
+-   The SP and PC are what kernel reports call the user stack pointer and PC.
+-   The CALLNO and ARGS are the system call number and incoming arguments.
+-   Each of these is filled with the DWARF register number corresponding,
+-   or -1 if there is none.  Returns zero when the information is available.  */
+-extern int ebl_syscall_abi (Ebl *ebl, int *sp, int *pc,
+-			    int *callno, int args[6]);
+-
+ /* Supply the ABI-specified state of DWARF CFI before CIE initial programs.
+ 
+    The DWARF 3.0 spec says that the default initial states of all registers
+diff --git a/libelf/libelfP.h b/libelf/libelfP.h
+index 7ee6625a..4007301b 100644
+--- a/libelf/libelfP.h
++++ b/libelf/libelfP.h
+@@ -463,9 +463,9 @@ extern Elf_Type __libelf_data_type (Elf *elf, int sh_type) internal_function;
+    These functions cannot be marked internal since they are aliases
+    of the export elfXX_fsize functions.*/
+ extern size_t __elf32_msize (Elf_Type __type, size_t __count,
+-			     unsigned int __version);
++			     unsigned int __version) __const_attribute__;
+ extern size_t __elf64_msize (Elf_Type __type, size_t __count,
+-			     unsigned int __version);
++			     unsigned int __version) __const_attribute__;
+ 
+ 
+ /* Create Elf descriptor from memory image.  */
+diff --git a/src/ar.c b/src/ar.c
+index ec32cee5..818115bd 100644
+--- a/src/ar.c
++++ b/src/ar.c
+@@ -1,5 +1,5 @@
+ /* Create, modify, and extract from archives.
+-   Copyright (C) 2005-2012, 2016 Red Hat, Inc.
++   Copyright (C) 2005-2012, 2016, 2017 Red Hat, Inc.
+    This file is part of elfutils.
+    Written by Ulrich Drepper <drepper@redhat.com>, 2005.
+ 
+@@ -442,7 +442,7 @@ static int
+ do_oper_extract (int oper, const char *arfname, char **argv, int argc,
+ 		 long int instance)
+ {
+-  bool found[argc];
++  bool found[argc > 0 ? argc : 1];
+   memset (found, '\0', sizeof (found));
+ 
+   size_t name_max = 0;
+@@ -1056,13 +1056,11 @@ do_oper_delete (const char *arfname, char **argv, int argc,
+     goto nonew_unlink;
+ 
+  errout:
+-#ifdef DEBUG
+   elf_end (elf);
+ 
+   arlib_fini ();
+ 
+   close (fd);
+-#endif
+ 
+   not_found (argc, argv, found);
+ 
+@@ -1070,12 +1068,18 @@ do_oper_delete (const char *arfname, char **argv, int argc,
+ }
+ 
+ 
+-static void
++/* Prints the given value in the given buffer without a trailing zero char.
++   Returns false if the given value doesn't fit in the given buffer.  */
++static bool
+ no0print (bool ofmt, char *buf, int bufsize, long int val)
+ {
+   char tmpbuf[bufsize + 1];
+-  snprintf (tmpbuf, sizeof (tmpbuf), ofmt ? "%-*lo" : "%-*ld", bufsize, val);
++  int ret = snprintf (tmpbuf, sizeof (tmpbuf), ofmt ? "%-*lo" : "%-*ld",
++		      bufsize, val);
++  if (ret >= (int) sizeof (tmpbuf))
++    return false;
+   memcpy (buf, tmpbuf, bufsize);
++  return true;
+ }
+ 
+ 
+@@ -1084,7 +1088,7 @@ do_oper_insert (int oper, const char *arfname, char **argv, int argc,
+ 		const char *member)
+ {
+   int status = 0;
+-  Elf *elf;
++  Elf *elf = NULL;
+   struct stat st;
+   int fd = open_archive (arfname, O_RDONLY, 0, &elf, &st, oper != oper_move);
+ 
+@@ -1303,13 +1307,11 @@ do_oper_insert (int oper, const char *arfname, char **argv, int argc,
+ 
+   if (status != 0)
+     {
+-#ifdef DEBUG
+       elf_end (elf);
+ 
+       arlib_fini ();
+ 
+       close (fd);
+-#endif
+ 
+       return status;
+     }
+@@ -1463,14 +1465,36 @@ do_oper_insert (int oper, const char *arfname, char **argv, int argc,
+ 		  memcpy (arhdr.ar_name, tmpbuf, sizeof (arhdr.ar_name));
+ 		}
+ 
+-	      no0print (false, arhdr.ar_date, sizeof (arhdr.ar_date),
+-			all->sec);
+-	      no0print (false, arhdr.ar_uid, sizeof (arhdr.ar_uid), all->uid);
+-	      no0print (false, arhdr.ar_gid, sizeof (arhdr.ar_gid), all->gid);
+-	      no0print (true, arhdr.ar_mode, sizeof (arhdr.ar_mode),
+-			all->mode);
+-	      no0print (false, arhdr.ar_size, sizeof (arhdr.ar_size),
+-			all->size);
++	      if (! no0print (false, arhdr.ar_date, sizeof (arhdr.ar_date),
++			      all->sec))
++		{
++		  error (0, errno, gettext ("cannot represent ar_date"));
++		  goto nonew_unlink;
++		}
++	      if (! no0print (false, arhdr.ar_uid, sizeof (arhdr.ar_uid),
++			      all->uid))
++		{
++		  error (0, errno, gettext ("cannot represent ar_uid"));
++		  goto nonew_unlink;
++		}
++	      if (! no0print (false, arhdr.ar_gid, sizeof (arhdr.ar_gid),
++			      all->gid))
++		{
++		  error (0, errno, gettext ("cannot represent ar_gid"));
++		  goto nonew_unlink;
++		}
++	      if (! no0print (true, arhdr.ar_mode, sizeof (arhdr.ar_mode),
++			all->mode))
++		{
++		  error (0, errno, gettext ("cannot represent ar_mode"));
++		  goto nonew_unlink;
++		}
++	      if (! no0print (false, arhdr.ar_size, sizeof (arhdr.ar_size),
++			all->size))
++		{
++		  error (0, errno, gettext ("cannot represent ar_size"));
++		  goto nonew_unlink;
++		}
+ 	      memcpy (arhdr.ar_fmag, ARFMAG, sizeof (arhdr.ar_fmag));
+ 
+ 	      if (unlikely (write_retry (newfd, &arhdr, sizeof (arhdr))
+@@ -1514,13 +1538,15 @@ do_oper_insert (int oper, const char *arfname, char **argv, int argc,
+       goto nonew_unlink;
+ 
+  errout:
+-#ifdef DEBUG
++  for (int cnt = 0; cnt < argc; ++cnt)
++    elf_end (found[cnt]->elf);
++
+   elf_end (elf);
+ 
+   arlib_fini ();
+ 
+-  close (fd);
+-#endif
++  if (fd != -1)
++    close (fd);
+ 
+   return status;
+ }
+diff --git a/src/elflint.c b/src/elflint.c
+index 51e53c23..f3a85c3c 100644
+--- a/src/elflint.c
++++ b/src/elflint.c
+@@ -4073,7 +4073,7 @@ section [%2zu] '%s' has type NOBITS but is read from the file in segment of prog
+ 			    bad = (databits == NULL
+ 				   || databits->d_size != shdr->sh_size);
+ 			    for (size_t idx = 0;
+-				 idx < databits->d_size && ! bad;
++				 ! bad && idx < databits->d_size;
+ 				 idx++)
+ 			      bad = ((char *) databits->d_buf)[idx] != 0;
+ 
+diff --git a/tests/addrcfi.c b/tests/addrcfi.c
+index 589b8513..2b7d7bd0 100644
+--- a/tests/addrcfi.c
++++ b/tests/addrcfi.c
+@@ -92,7 +92,7 @@ print_register (void *arg,
+ 
+   printf ("\t%s reg%u (%s%s): ", setname, regno, prefix, regname);
+ 
+-  Dwarf_Op ops_mem[2];
++  Dwarf_Op ops_mem[3];
+   Dwarf_Op *ops;
+   size_t nops;
+   int result = dwarf_frame_register (stuff->frame, regno, ops_mem, &ops, &nops);
+-- 
+2.36.1
+
diff --git a/buildtools/third_party/eu-strip/build.sh b/buildtools/third_party/eu-strip/build.sh
index 86f2b67f6bbd1..c073e9a15827a 100755
--- a/buildtools/third_party/eu-strip/build.sh
+++ b/buildtools/third_party/eu-strip/build.sh
@@ -1,7 +1,7 @@
 #!/bin/sh -xe
 
 rm -rf elfutils
-git clone git://sourceware.org/git/elfutils.git
+git clone https://sourceware.org/git/elfutils.git
 cd elfutils
 git checkout elfutils-0.170
 autoheader
@@ -9,6 +9,7 @@ aclocal
 autoconf
 automake --add-missing
 patch -p1 < ../fix-elf-size.patch
+patch -p1 < ../0001-gcc-fixes.patch
 mkdir build
 cd build
 ../configure --enable-maintainer-mode
-- 
2.45.2