Resolve conflicts.
authorjbj <devnull@localhost>
Tue, 4 Mar 2003 22:03:25 +0000 (22:03 +0000)
committerjbj <devnull@localhost>
Tue, 4 Mar 2003 22:03:25 +0000 (22:03 +0000)
CVS patchset: 6647
CVS date: 2003/03/04 22:03:25

15 files changed:
elfutils/configure.ac
elfutils/libdw/Makefile.am
elfutils/libebl/Makefile.am
elfutils/libelf/elf32_checksum.c
elfutils/libelf/elf32_updatefile.c
elfutils/libelf/elf32_updatenull.c
elfutils/libelf/elf_begin.c
elfutils/libelf/elf_error.c
elfutils/libelf/elf_flagelf.c
elfutils/libelf/elf_getdata.c
elfutils/libelf/gelf_getphdr.c
elfutils/libelf/gelf_xlate.h
elfutils/libelf/libelf.h
elfutils/libelf/libelfP.h
elfutils/po/elfutils.pot

index b63d990..09ed687 100644 (file)
@@ -1,7 +1,7 @@
 dnl Process this file with autoconf to produce a configure script. -*-m4-*-
 dnl Configure input file for elfutils.
 dnl
-dnl Copyright (C) 1996-2001, 2002 Red Hat, Inc.
+dnl Copyright (C) 1996-2002, 2003 Red Hat, Inc.
 dnl
 dnl This program is Open Source software; you can redistribute it and/or
 dnl modify it under the terms of the Open Software License version 1.0 as
@@ -13,14 +13,19 @@ dnl License version 1.0 from http://www.opensource.org/licenses/osl.php or
 dnl by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
 dnl 3001 King Ranch Road, Ukiah, CA 95482.
 dnl
-AC_INIT([elfutils],[0.63],[drepper@redhat.com],[elfutils])
+AC_INIT([elfutils],[0.76],[drepper@redhat.com],[elfutils])
 AM_INIT_AUTOMAKE([gnits 1.6.3 dist-bzip2])
-AC_COPYRIGHT([Copyright (C) 1996-2001, 2002 Red Hat, Inc.])
-AC_CONFIG_SRCDIR([libelf/elf_begin.c])
-AM_CONFIG_HEADER([config.h])
+AC_COPYRIGHT([Copyright (C) 1996-2002, 2003 Red Hat, Inc.])
+AC_CONFIG_SRCDIR([src/readelf.c])
+AC_CONFIG_HEADERS([config.h])
 AC_PREREQ(2.54)                        dnl Minimum Autoconf version required.
 AC_CANONICAL_HOST
 
+AC_ARG_ENABLE([tls],
+[  --enable-tls            enable use of thread local storage],
+AC_DEFINE(USE_TLS))
+AH_TEMPLATE([USE_TLS], [Defined if thread local storage should be used.])
+
 ALL_LINGUAS=
 
 AC_PROG_CC
index 3d201c4..043e692 100644 (file)
@@ -17,7 +17,7 @@
 ## Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 ##
 DEFS = -D_GNU_SOURCE -DHAVE_CONFIG_H
-AM_CFLAGS = -Wall -Werror
+AM_CFLAGS = -Wall -Werror -Wshadow
 INCLUDES = -I. -I$(srcdir) -I$(srcdir)/../libelf -I.. -I$(srcdir)/../lib
 
 LINT = splint
@@ -31,13 +31,14 @@ noinst_PROGRAMS = $(noinst_LIBRARIES:_pic.a=.so)
 #euinclude_HEADERS = libdw.h
 
 libdw_a_SOURCES = dwarf_begin.c dwarf_begin_elf.c dwarf_end.c dwarf_get_elf.c \
+                 dwarf_get_pubnames.c \
                  dwarf_error.c
 
 libdw_pic_a_SOURCES =
 am_libdw_pic_a_OBJECTS = $(libdw_a_SOURCES:.c=.os)
 
 libdw_so_SOURCES =
-libdw.so: libdw_pic.a libdw.map
+libdw.so: libdw_pic.a $(srcdir)/libdw.map
        $(CC) -shared -o $@ -Wl,--whole-archive,$<,--no-whole-archive \
              -Wl,--version-script,$(srcdir)/libdw.map,--no-undefined \
              -Wl,--soname,$@.$(VERSION) \
index 3d01575..b705bab 100644 (file)
@@ -1,7 +1,7 @@
 ## Process this file with automake to create Makefile.in
 ## Configure input file for elfutils.
 ##
-## Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
+## Copyright (C) 2000, 2001, 2002, 2003 Red Hat, Inc.
 ##
 ## This program is Open Source software; you can redistribute it and/or
 ## modify it under the terms of the Open Software License version 1.0 as
@@ -23,11 +23,11 @@ VERSION = 1
 PACKAGE_VERSION = @PACKAGE_VERSION@
 
 #lib_LIBRARIES = libebl.a
-modules = i386 sh mips x86_64 ia64 alpha arm
+modules = i386 sh mips x86_64 ia64 alpha arm sparc
 noinst_LIBRARIES = libebl.a libebl_pic.a \
                   libebl_i386_pic.a libebl_sh_pic.a libebl_mips_pic.a \
                   libebl_x86_64_pic.a libebl_ia64_pic.a libebl_alpha_pic.a \
-                  libebl_arm_pic.a
+                  libebl_arm_pic.a libebl_sparc_pic.a
 noinst_PROGRAMS = $(noinst_LIBRARIES:_pic.a=.so)
 
 #euincludedir = $(includedir)/elfutils
@@ -42,7 +42,7 @@ gen_SOURCES = eblopenbackend.c eblclosebackend.c eblstrtab.c \
              eblgstrtab.c eblosabiname.c eblmachineflagcheck.c \
              eblreloctypecheck.c ebldynamictagcheck.c \
              eblcorenotetypename.c eblobjnotetypename.c \
-             eblcorenote.c eblobjnote.c
+             eblcorenote.c eblobjnote.c ebldebugscnp.c
 
 libebl_a_SOURCES = $(gen_SOURCES)
 
@@ -133,6 +133,16 @@ libebl_arm.so: libebl_arm_pic.a libebl_arm.map
              -Wl,--version-script,$(srcdir)/libebl_arm.map,--no-undefined
 
 
+sparc_SRCS = sparc_init.c sparc_destr.c sparc_symbol.c
+libebl_sparc_pic_a_SOURCES =
+am_libebl_sparc_pic_a_OBJECTS = $(sparc_SRCS:.c=.os)
+
+libebl_sparc_so_SOURCES =
+libebl_sparc.so: libebl_sparc_pic.a libebl_sparc.map
+       $(CC) -shared -o $@ -Wl,--whole-archive,$<,--no-whole-archive \
+             -Wl,--version-script,$(srcdir)/libebl_sparc.map,--no-undefined
+
+
 %.os: %.c %.o
        if $(COMPILE) -c -o $@ -fpic -DPIC -DSHARED -MT $@ -MD -MP \
          -MF "$(DEPDIR)/$*.Tpo" `test -f '$<' || echo '$(srcdir)/'`$<; \
index 665c401..873ce06 100644 (file)
 #endif
 
 
+/* The SECTION_STRIP_P macro wants to call into libebl which we cannot
+   do and do not have to do here.  Provide a dummy replacement.  */
+#define ebl_debugscn_p(ebl, name) true
+
+
 #define process_block(crc, data) \
   __libelf_crc32 (crc, data->d_buf, data->d_size)
 
@@ -79,8 +84,9 @@ elfw2(LIBELFBITS,checksum) (Elf *elf)
          return -1l;
        }
 
-      if (SECTION_STRIP_P (shdr, elf_strptr (elf, shstrndx, shdr->sh_name),
-                          true))
+      if (SECTION_STRIP_P (NULL, NULL, NULL, shdr,
+                          elf_strptr (elf, shstrndx, shdr->sh_name),
+                          true, false))
        /* The section can be stripped.  Don't use it.  */
        continue;
 
index 90d1c17..e232daa 100644 (file)
 #endif
 
 
+static int
+compare_sections (const void *a, const void *b)
+{
+  const Elf_Scn **scna = (const Elf_Scn **) a;
+  const Elf_Scn **scnb = (const Elf_Scn **) b;
+
+  if ((*scna)->shdr.ELFW(e,LIBELFBITS)->sh_offset
+      < (*scnb)->shdr.ELFW(e,LIBELFBITS)->sh_offset)
+    return -1;
+
+  if ((*scna)->shdr.ELFW(e,LIBELFBITS)->sh_offset
+      > (*scnb)->shdr.ELFW(e,LIBELFBITS)->sh_offset)
+    return 1;
+
+  if ((*scna)->index < (*scnb)->index)
+    return -1;
+
+  if ((*scna)->index > (*scnb)->index)
+    return 1;
+
+  return 0;
+}
+
+
+/* Insert the sections in the list into the provided array and sort
+   them according to their start offsets.  For sections with equal
+   start offsets the section index is used.  */
+static void
+sort_sections (Elf_Scn **scns, Elf_ScnList *list)
+{
+  Elf_Scn **scnp = scns;
+  do
+    {
+      int cnt;
+
+      for (cnt = 0; cnt < list->cnt; ++cnt)
+       *scnp++ = &list->data[cnt];
+    }
+  while ((list = list->next) != NULL);
+
+  qsort (scns, scnp - scns, sizeof (*scns), compare_sections);
+}
+
+
 int
 internal_function
 __elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
@@ -51,7 +95,7 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
       assert (sizeof (ElfW2(LIBELFBITS,Ehdr))
              == elf_typesize (LIBELFBITS, ELF_T_EHDR, 1));
 
-      if (change_bo)
+      if (unlikely (change_bo))
        {
          /* Today there is only one version of the ELF header.  */
 #if EV_NUM != 2
@@ -88,7 +132,7 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
        memset (elf->map_address + elf->start_offset + ehdr->e_ehsize,
                __libelf_fill_byte, ehdr->e_phoff - ehdr->e_ehsize);
 
-      if (change_bo)
+      if (unlikely (change_bo))
        {
          /* Today there is only one version of the ELF header.  */
 #if EV_NUM != 2
@@ -101,7 +145,7 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
          /* Do the real work.  */
          (*fctp) (elf->map_address + elf->start_offset + ehdr->e_phoff,
                   elf->state.ELFW(elf,LIBELFBITS).phdr,
-                  sizeof (ElfW2(LIBELFBITS,Phdr)), ehdr->e_phnum);
+                  sizeof (ElfW2(LIBELFBITS,Phdr)) * ehdr->e_phnum, 1);
        }
       else
        memcpy (elf->map_address + elf->start_offset + ehdr->e_phoff,
@@ -123,6 +167,11 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
     {
       ElfW2(LIBELFBITS,Shdr) *shdr_dest;
       Elf_ScnList *list = &elf->state.ELFW(elf,LIBELFBITS).scns;
+      Elf_Scn **scns = (Elf_Scn **) alloca (shnum * sizeof (Elf_Scn *));
+      char *shdr_start = ((char *) elf->map_address + elf->start_offset
+                         + ehdr->e_shoff);
+      char *shdr_end = shdr_start + ehdr->e_shnum * ehdr->e_shentsize;
+      size_t cnt;
 
 #if EV_NUM != 2
       xfct_t shdr_fctp = __elf_xfctstom[__libelf_version - 1][EV_CURRENT - 1][ELFW(ELFCLASS, LIBELFBITS) - 1][ELF_T_SHDR];
@@ -133,110 +182,113 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
       shdr_dest = (ElfW2(LIBELFBITS,Shdr) *)
        ((char *) elf->map_address + elf->start_offset + ehdr->e_shoff);
 
-      do
-       {
-         int cnt;
+      /* Get all sections into the array and sort them.  */
+      sort_sections (scns, list);
 
-         for (cnt = 0; cnt < list->cnt; ++cnt)
-           {
-             ElfW2(LIBELFBITS,Shdr) *shdr;
-             char *scn_start;
-             Elf_Data_List *dl;
+      /* Iterate over all the section in the order in which they
+        appear in the output file.  */
+      for (cnt = 0; cnt < shnum; ++cnt)
+       {
+         Elf_Scn *scn = scns[cnt];
+         ElfW2(LIBELFBITS,Shdr) *shdr;
+         char *scn_start;
+         Elf_Data_List *dl;
 
-             shdr = list->data[cnt].shdr.ELFW(e,LIBELFBITS);
+         shdr = scn->shdr.ELFW(e,LIBELFBITS);
 
-             scn_start = ((char *) elf->map_address
-                          + elf->start_offset + shdr->sh_offset);
-             dl = &list->data[cnt].data_list;
+         scn_start = ((char *) elf->map_address
+                      + elf->start_offset + shdr->sh_offset);
+         dl = &scn->data_list;
 
-             if (shdr->sh_type != SHT_NOBITS
-                 && list->data[cnt].data_list_rear != NULL)
-               do
+         if (shdr->sh_type != SHT_NOBITS && scn->data_list_rear != NULL)
+           do
+             {
+               if ((scn->flags | dl->flags | elf->flags) & ELF_F_DIRTY)
                  {
-                   if ((list->data[cnt].flags | dl->flags
-                        | elf->flags) & ELF_F_DIRTY)
+                   if (scn_start + dl->data.d.d_off != last_position)
                      {
-                       if (scn_start + dl->data.d.d_off != last_position)
+                       if (scn_start + dl->data.d.d_off > last_position)
                          {
-                           if (scn_start + dl->data.d.d_off > last_position)
-                             memset (last_position, __libelf_fill_byte,
-                                     scn_start + dl->data.d.d_off
-                                     - last_position);
+                           /* This code assumes that the data blocks for
+                              a section are ordered by offset.  */
+                           size_t written = 0;
+
+                           if (last_position < shdr_start)
+                             {
+                               written = MIN (scn_start + dl->data.d.d_off
+                                              - last_position,
+                                              shdr_start - last_position);
+
+                               memset (last_position, __libelf_fill_byte,
+                                       written);
+                             }
+
+                           if (last_position + written
+                               != scn_start + dl->data.d.d_off
+                               && shdr_end < scn_start + dl->data.d.d_off)
+                             memset (shdr_end, __libelf_fill_byte,
+                                     scn_start + dl->data.d.d_off - shdr_end);
+
                            last_position = scn_start + dl->data.d.d_off;
                          }
+                     }
 
-                       if (change_bo)
-                         {
-                           size_t recsize;
-
+                   if (unlikely (change_bo))
+                     {
 #if EV_NUM != 2
-                           fctp = __elf_xfctstom[__libelf_version - 1][dl->data.d.d_version - 1][ELFW(ELFCLASS, LIBELFBITS) - 1][dl->data.d.d_type];
-                           recsize = __libelf_type_sizes[dl->d_version - 1][ELFW(ELFCLASS,LIBELFBITS) - 1][dl->data.d.d_type];
+                       fctp = __elf_xfctstom[__libelf_version - 1][dl->data.d.d_version - 1][ELFW(ELFCLASS, LIBELFBITS) - 1][dl->data.d.d_type];
 #else
 # undef fctp
-                           fctp = __elf_xfctstom[0][0][ELFW(ELFCLASS, LIBELFBITS) - 1][dl->data.d.d_type];
-                           recsize = __libelf_type_sizes[0][ELFW(ELFCLASS,LIBELFBITS) - 1][dl->data.d.d_type];
+                       fctp = __elf_xfctstom[0][0][ELFW(ELFCLASS, LIBELFBITS) - 1][dl->data.d.d_type];
 #endif
 
-                           /* Make sure the data size matches the
-                              record size.  */
-                           assert (dl->data.d.d_size % recsize == 0);
+                       /* Do the real work.  */
+                       (*fctp) (last_position, dl->data.d.d_buf,
+                                dl->data.d.d_size, 1);
 
-                           /* Do the real work.  */
-                           (*fctp) (last_position, dl->data.d.d_buf, recsize,
-                                    dl->data.d.d_size / recsize);
-
-                           last_position += dl->data.d.d_size;
-                         }
-                       else
-                         last_position = mempcpy (last_position,
-                                                  dl->data.d.d_buf,
-                                                  dl->data.d.d_size);
+                       last_position += dl->data.d.d_size;
                      }
                    else
-                     last_position += dl->data.d.d_size;
+                     last_position = mempcpy (last_position,
+                                              dl->data.d.d_buf,
+                                              dl->data.d.d_size);
+                 }
+               else
+                 last_position += dl->data.d.d_size;
 
-                   dl->flags &= ~ELF_F_DIRTY;
+               dl->flags &= ~ELF_F_DIRTY;
 
-                   dl = dl->next;
-                 }
-               while (dl != NULL);
-
-             /* Write the section header table entry if necessary.  */
-             if ((list->data[cnt].shdr_flags | elf->flags) & ELF_F_DIRTY)
-               {
-                 if (change_bo)
-                   (*shdr_fctp) (shdr_dest,
-                                 list->data[cnt].shdr.ELFW(e,LIBELFBITS),
-                                 sizeof (ElfW2(LIBELFBITS,Shdr)), 1);
-                 else
-                   memcpy (shdr_dest, list->data[cnt].shdr.ELFW(e,LIBELFBITS),
-                           sizeof (ElfW2(LIBELFBITS,Shdr)));
-
-                 list->data[cnt].shdr_flags  &= ~ELF_F_DIRTY;
-               }
-             ++shdr_dest;
-
-             list->data[cnt].flags &= ~ELF_F_DIRTY;
+               dl = dl->next;
+             }
+           while (dl != NULL);
+
+         /* Write the section header table entry if necessary.  */
+         if ((scn->shdr_flags | elf->flags) & ELF_F_DIRTY)
+           {
+             if (unlikely (change_bo))
+               (*shdr_fctp) (&shdr_dest[scn->index],
+                             scn->shdr.ELFW(e,LIBELFBITS),
+                             sizeof (ElfW2(LIBELFBITS,Shdr)), 1);
+             else
+               memcpy (&shdr_dest[scn->index],
+                       scn->shdr.ELFW(e,LIBELFBITS),
+                       sizeof (ElfW2(LIBELFBITS,Shdr)));
+
+             scn->shdr_flags  &= ~ELF_F_DIRTY;
            }
 
-         assert (list->next == NULL || list->cnt == list->max);
+         scn->flags &= ~ELF_F_DIRTY;
        }
-      while ((list = list->next) != NULL);
 
 
       /* Fill the gap between last section and section header table if
         necessary.  */
       if ((elf->flags & ELF_F_DIRTY)
-         && last_position != ((char *) elf->map_address + elf->start_offset
+         && last_position < ((char *) elf->map_address + elf->start_offset
                               + ehdr->e_shoff))
-       {
-         assert ((char *) elf->map_address + elf->start_offset + ehdr->e_shoff
-                 > last_position);
-         memset (last_position, __libelf_fill_byte,
-                 (char *) elf->map_address + elf->start_offset + ehdr->e_shoff
-                 - last_position);
-       }
+       memset (last_position, __libelf_fill_byte,
+               (char *) elf->map_address + elf->start_offset + ehdr->e_shoff
+               - last_position);
     }
 
   /* That was the last part.  Clear the overall flag.  */
@@ -297,9 +349,7 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
   char fillbuf[FILLBUFSIZE];
   size_t filled = 0;
   ElfW2(LIBELFBITS,Ehdr) *ehdr;
-#if EV_NUM != 2
   xfct_t fctp;
-#endif
   off_t last_offset;
 
   /* We need the ELF header several times.  */
@@ -316,7 +366,7 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
       assert (sizeof (ElfW2(LIBELFBITS,Ehdr))
              == elf_typesize (LIBELFBITS, ELF_T_EHDR, 1));
 
-      if (change_bo)
+      if (unlikely (change_bo))
        {
          /* Today there is only one version of the ELF header.  */
 #if EV_NUM != 2
@@ -355,7 +405,7 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
       && ((elf->state.ELFW(elf,LIBELFBITS).phdr_flags | elf->flags)
          & ELF_F_DIRTY))
     {
-      ElfW2(LIBELFBITS,Phdr) tmp_phdr;
+      ElfW2(LIBELFBITS,Phdr) *tmp_phdr = NULL;
       ElfW2(LIBELFBITS,Phdr) *out_phdr = elf->state.ELFW(elf,LIBELFBITS).phdr;
 
       /* Maybe the user wants a gap between the ELF header and the program
@@ -366,7 +416,7 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
                       != 0))
        return 1;
 
-      if (change_bo)
+      if (unlikely (change_bo))
        {
          /* Today there is only one version of the ELF header.  */
 #if EV_NUM != 2
@@ -376,12 +426,21 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
 # define fctp __elf_xfctstom[0][EV_CURRENT - 1][ELFW(ELFCLASS, LIBELFBITS) - 1][ELF_T_PHDR]
 #endif
 
+         /* Allocate sufficient memory.  */
+         tmp_phdr = (ElfW2(LIBELFBITS,Phdr) *)
+           malloc (sizeof (ElfW2(LIBELFBITS,Phdr)) * ehdr->e_phnum);
+         if (tmp_phdr == NULL)
+           {
+             __libelf_seterrno (ELF_E_NOMEM);
+             return 1;
+           }
+
          /* Write the converted ELF header in a temporary buffer.  */
-         (*fctp) (&tmp_phdr, elf->state.ELFW(elf,LIBELFBITS).phdr,
-                  sizeof (ElfW2(LIBELFBITS,Phdr)), ehdr->e_phnum);
+         (*fctp) (tmp_phdr, elf->state.ELFW(elf,LIBELFBITS).phdr,
+                  sizeof (ElfW2(LIBELFBITS,Phdr)) * ehdr->e_phnum, 1);
 
          /* This is the buffer we want to write.  */
-         out_phdr = &tmp_phdr;
+         out_phdr = tmp_phdr;
        }
 
       /* Write out the ELF header.  */
@@ -394,6 +453,9 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
          return 1;
        }
 
+      /* This is a no-op we we have not allocated any memory.  */
+      free (tmp_phdr);
+
       elf->state.ELFW(elf,LIBELFBITS).phdr_flags &= ~ELF_F_DIRTY;
     }
 
@@ -406,15 +468,15 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
   if (shnum > 0)
     {
       off_t shdr_offset;
-      xfct_t shdr_fctp;
       Elf_ScnList *list = &elf->state.ELFW(elf,LIBELFBITS).scns;
       ElfW2(LIBELFBITS,Shdr) *shdr_data;
-      ElfW2(LIBELFBITS,Shdr) *shdr_data_begin;
+      Elf_Scn **scns = (Elf_Scn **) alloca (shnum * sizeof (Elf_Scn *));
       int shdr_flags;
+      size_t cnt;
 
       shdr_offset = elf->start_offset + ehdr->e_shoff;
 #if EV_NUM != 2
-      shdr_fctp = __elf_xfctstom[__libelf_version - 1][EV_CURRENT - 1][ELFW(ELFCLASS, LIBELFBITS) - 1][ELF_T_SHDR];
+      xfct_t shdr_fctp = __elf_xfctstom[__libelf_version - 1][EV_CURRENT - 1][ELFW(ELFCLASS, LIBELFBITS) - 1][ELF_T_SHDR];
 #else
 # undef shdr_fctp
 # define shdr_fctp __elf_xfctstom[0][EV_CURRENT - 1][ELFW(ELFCLASS, LIBELFBITS) - 1][ELF_T_SHDR]
@@ -425,127 +487,110 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf, int change_bo, size_t shnum)
          alloca (shnum * sizeof (ElfW2(LIBELFBITS,Shdr)));
       else
        shdr_data = elf->state.ELFW(elf,LIBELFBITS).shdr;
-      shdr_data_begin = shdr_data;
       shdr_flags = elf->flags;
 
-      do
-       {
-         int cnt;
+      /* Get all sections into the array and sort them.  */
+      sort_sections (scns, list);
 
-         for (cnt = 0; cnt < list->cnt; ++cnt)
-           {
-             ElfW2(LIBELFBITS,Shdr) *shdr;
-             off_t scn_start;
-             Elf_Data_List *dl;
+      for (cnt = 0; cnt < shnum; ++cnt)
+       {
+         Elf_Scn *scn = scns[cnt];
+         ElfW2(LIBELFBITS,Shdr) *shdr;
+         off_t scn_start;
+         Elf_Data_List *dl;
 
-             shdr = list->data[cnt].shdr.ELFW(e,LIBELFBITS);
+         shdr = scn->shdr.ELFW(e,LIBELFBITS);
 
-             scn_start = elf->start_offset + shdr->sh_offset;
-             dl = &list->data[cnt].data_list;
+         scn_start = elf->start_offset + shdr->sh_offset;
+         dl = &scn->data_list;
 
-             if (shdr->sh_type != SHT_NOBITS
-                 && list->data[cnt].data_list_rear != NULL
-                 && list->data[cnt].index != 0)
-               do
+         if (shdr->sh_type != SHT_NOBITS && scn->data_list_rear != NULL
+             && scn->index != 0)
+           do
+             {
+               if ((scn->flags | dl->flags | elf->flags) & ELF_F_DIRTY)
                  {
-                   if ((list->data[cnt].flags | dl->flags
-                        | elf->flags) & ELF_F_DIRTY)
-                     {
-                       char tmpbuf[MAX_TMPBUF];
-                       void *buf = dl->data.d.d_buf;
-
-                       if (scn_start + dl->data.d.d_off != last_offset)
-                         {
-                           assert (last_offset
-                                   < scn_start + dl->data.d.d_off);
+                   char tmpbuf[MAX_TMPBUF];
+                   void *buf = dl->data.d.d_buf;
 
-                           if (unlikely (fill (elf->fildes, last_offset,
-                                               (scn_start + dl->data.d.d_off)
-                                               - last_offset, fillbuf,
-                                               &filled) != 0))
-                             return 1;
+                   if (scn_start + dl->data.d.d_off != last_offset)
+                     {
+                       assert (last_offset < scn_start + dl->data.d.d_off);
 
-                           last_offset = scn_start + dl->data.d.d_off;
-                         }
+                       if (unlikely (fill (elf->fildes, last_offset,
+                                           (scn_start + dl->data.d.d_off)
+                                           - last_offset, fillbuf,
+                                           &filled) != 0))
+                         return 1;
 
-                       if (change_bo)
-                         {
-                           size_t recsize;
+                       last_offset = scn_start + dl->data.d.d_off;
+                     }
 
+                   if (unlikely (change_bo))
+                     {
 #if EV_NUM != 2
-                           fctp = __elf_xfctstom[__libelf_version - 1][dl->data.d.d_version - 1][ELFW(ELFCLASS, LIBELFBITS) - 1][dl->data.d.d_type];
-                           recsize = __libelf_type_sizes[dl->d_version - 1][ELFW(ELFCLASS,LIBELFBITS) - 1][dl->data.d.d_type];
+                       fctp = __elf_xfctstom[__libelf_version - 1][dl->data.d.d_version - 1][ELFW(ELFCLASS, LIBELFBITS) - 1][dl->data.d.d_type];
 #else
-                           fctp = __elf_xfctstom[0][0][ELFW(ELFCLASS, LIBELFBITS) - 1][dl->data.d.d_type];
-                           recsize = __libelf_type_sizes[0][ELFW(ELFCLASS,LIBELFBITS) - 1][dl->data.d.d_type];
+# undef fctp
+                       fctp = __elf_xfctstom[0][0][ELFW(ELFCLASS, LIBELFBITS) - 1][dl->data.d.d_type];
 #endif
 
-                           /* Make sure the data size matches the
-                              record size.  */
-                           assert (dl->data.d.d_size % recsize == 0);
-
-                           buf = tmpbuf;
-                           if (dl->data.d.d_size > MAX_TMPBUF)
+                       buf = tmpbuf;
+                       if (dl->data.d.d_size > MAX_TMPBUF)
+                         {
+                           buf = malloc (dl->data.d.d_size);
+                           if (buf == NULL)
                              {
-                               buf = malloc (dl->data.d.d_size);
-                               if (buf == NULL)
-                                 {
-                                   __libelf_seterrno (ELF_E_NOMEM);
-                                   return 1;
-                                 }
+                               __libelf_seterrno (ELF_E_NOMEM);
+                               return 1;
                              }
-
-                           /* Do the real work.  */
-                           (*fctp) (buf, dl->data.d.d_buf, recsize,
-                                    dl->data.d.d_size / recsize);
                          }
 
-                       if (unlikely (pwrite (elf->fildes, buf,
-                                             dl->data.d.d_size, last_offset)
-                                     != dl->data.d.d_size))
-                         {
-                           if (buf != dl->data.d.d_buf && buf != tmpbuf)
-                             free (buf);
-
-                           __libelf_seterrno (ELF_E_WRITE_ERROR);
-                           return 1;
-                         }
+                       /* Do the real work.  */
+                       (*fctp) (buf, dl->data.d.d_buf, dl->data.d.d_size, 1);
+                     }
 
+                   if (unlikely (pwrite (elf->fildes, buf,
+                                         dl->data.d.d_size, last_offset)
+                                 != dl->data.d.d_size))
+                     {
                        if (buf != dl->data.d.d_buf && buf != tmpbuf)
                          free (buf);
-                     }
-
-                   last_offset += dl->data.d.d_size;
 
-                   dl->flags &= ~ELF_F_DIRTY;
+                       __libelf_seterrno (ELF_E_WRITE_ERROR);
+                       return 1;
+                     }
 
-                   dl = dl->next;
+                   if (buf != dl->data.d.d_buf && buf != tmpbuf)
+                     free (buf);
                  }
-               while (dl != NULL);
 
-             /* Collect the section header table information.  */
-             if (change_bo)
-               (*shdr_fctp) (shdr_data++,
-                             list->data[cnt].shdr.ELFW(e,LIBELFBITS),
-                             sizeof (ElfW2(LIBELFBITS,Shdr)), 1);
-             else if (elf->state.ELFW(elf,LIBELFBITS).shdr == NULL)
-               shdr_data = mempcpy (shdr_data,
-                                    list->data[cnt].shdr.ELFW(e,LIBELFBITS),
-                                    sizeof (ElfW2(LIBELFBITS,Shdr)));
+               last_offset += dl->data.d.d_size;
 
-             shdr_flags |= list->data[cnt].shdr_flags;
-             list->data[cnt].shdr_flags  &= ~ELF_F_DIRTY;
-           }
-       }
-      while ((list = list->next) != NULL);
+               dl->flags &= ~ELF_F_DIRTY;
 
+               dl = dl->next;
+             }
+           while (dl != NULL);
+         else if (shdr->sh_type != SHT_NOBITS && scn->index != 0)
+           last_offset = scn_start + shdr->sh_size;
 
-      if (change_bo || elf->state.ELFW(elf,LIBELFBITS).shdr == NULL)
-       assert (shdr_data == &shdr_data_begin[shnum]);
+         /* Collect the section header table information.  */
+         if (unlikely (change_bo))
+           (*shdr_fctp) (&shdr_data[scn->index],
+                         scn->shdr.ELFW(e,LIBELFBITS),
+                         sizeof (ElfW2(LIBELFBITS,Shdr)), 1);
+         else if (elf->state.ELFW(elf,LIBELFBITS).shdr == NULL)
+           memcpy (&shdr_data[scn->index], scn->shdr.ELFW(e,LIBELFBITS),
+                   sizeof (ElfW2(LIBELFBITS,Shdr)));
+
+         shdr_flags |= scn->shdr_flags;
+         scn->shdr_flags  &= ~ELF_F_DIRTY;
+       }
 
       /* Write out the section header table.  */
       if (shdr_flags & ELF_F_DIRTY
-         && unlikely (pwrite (elf->fildes, shdr_data_begin,
+         && unlikely (pwrite (elf->fildes, shdr_data,
                               sizeof (ElfW2(LIBELFBITS,Shdr)) * shnum,
                               shdr_offset)
                       != sizeof (ElfW2(LIBELFBITS,Shdr)) * shnum))
index 1f88dd9..d8483f4 100644 (file)
@@ -24,6 +24,7 @@
 #include <sys/param.h>
 
 #include "libelfP.h"
+#include "../libebl/elf-knowledge.h"
 
 #ifndef LIBELFBITS
 # define LIBELFBITS 32
@@ -194,10 +195,12 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf, int *change_bop, size_t shnum)
                      return -1;
                    }
                  /* FALLTHROUGH */
-               case SHT_HASH:
                case SHT_SYMTAB_SHNDX:
                  sh_entsize = elf_typesize (32, ELF_T_WORD, 1);
                  break;
+               case SHT_HASH:
+                 sh_entsize = SH_ENTSIZE_HASH (ehdr);
+                 break;
                case SHT_DYNAMIC:
                  sh_entsize = elf_typesize (LIBELFBITS, ELF_T_DYN, 1);
                  break;
@@ -275,7 +278,10 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf, int *change_bop, size_t shnum)
 
              if (elf->flags & ELF_F_LAYOUT)
                {
-                 size = MAX (size, shdr->sh_offset + shdr->sh_size);
+                 size = MAX (size,
+                             shdr->sh_offset
+                             + (shdr->sh_type != SHT_NOBITS
+                                ? shdr->sh_size : 0));
 
                  /* The alignment must be a power of two.  This is a
                     requirement from the ELF specification.  Additionally
@@ -310,7 +316,8 @@ __elfw2(LIBELFBITS,updatenull) (Elf *elf, int *change_bop, size_t shnum)
              /* Check that the section size is actually a multiple of
                 the entry size.  */
              if (shdr->sh_entsize != 0
-                 && unlikely (shdr->sh_size % shdr->sh_entsize != 0))
+                 && unlikely (shdr->sh_size % shdr->sh_entsize != 0)
+                 && (elf->flags & ELF_F_PERMISSIVE) == 0)
                {
                  __libelf_seterrno (ELF_E_INVALID_SHENTSIZE);
                  return -1;
index 7f13da1..60c6fb1 100644 (file)
@@ -18,6 +18,8 @@
 
 #include <assert.h>
 #include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
 #include <stdbool.h>
 #include <stddef.h>
 #include <string.h>
@@ -89,9 +91,15 @@ get_shnum (/*@null@*/ void *map_address, unsigned char *e_ident, int fildes,
       if (e_ident[EI_DATA] != MY_ELFDATA)
        {
          if (is32)
-           CONVERT (ehdr.e32->e_shnum);
+           {
+             CONVERT (ehdr.e32->e_shnum);
+             CONVERT (ehdr.e32->e_shoff);
+           }
          else
-           CONVERT (ehdr.e64->e_shnum);
+           {
+             CONVERT (ehdr.e64->e_shnum);
+             CONVERT (ehdr.e64->e_shoff);
+           }
        }
     }
 
@@ -985,7 +993,7 @@ elf_begin (int fildes, Elf_Cmd cmd, Elf *ref)
   if (ref != NULL)
     /* Make sure the descriptor is not suddenly going away.  */
     rwlock_rdlock (ref->lock);
-  else if (fildes == -1)
+  else if (fcntl (fildes, F_GETFL) == -1 && errno == EBADF)
     {
       /* We cannot do anything productive without a file descriptor.  */
       __libelf_seterrno (ELF_E_INVALID_FILE);
index 224ff9d..534ca5a 100644 (file)
 #include "libelfP.h"
 
 
+#ifdef USE_TLS
+/* The error number.  */
+static __thread int global_error;
+#else
 /* This is the key for the thread specific memory.  */
 /*@unchecked@*/ /*@null@*/
 static tls_key_t key;
@@ -53,6 +57,7 @@ elf_errno (void)
 {
   int result;
 
+#ifndef USE_TLS
   /* If we have not yet initialized the buffer do it now.  */
   once_execute (once, init);
 
@@ -65,6 +70,7 @@ elf_errno (void)
       setspecific (key, (void *) (intptr_t) ELF_E_NOERROR);
       return result;
     }
+#endif /* TLS */
 
   result = global_error;
   global_error = ELF_E_NOERROR;
@@ -73,24 +79,6 @@ elf_errno (void)
 /*@=mods@*/
 
 
-/*@-mods@*/
-void
-internal_function
-__libelf_seterrno (int value)
-{
-  /* If we have not yet initialized the buffer do it now.  */
-  once_execute (once, init);
-
-  if (threaded)
-    /* We do not allocate memory for the data.  It is only a word.
-       We can store it in place of the pointer.  */
-    setspecific (key, (void *) (intptr_t) value);
-
-  global_error = value;
-}
-/*@=mods@*/
-
-
 /* Return the appropriate message for the error.  */
 /*@unchecked@*/
 static const char msgstr[] =
@@ -98,7 +86,11 @@ static const char msgstr[] =
 #define ELF_E_NOERROR_IDX 0
   N_("no error")
   "\0"
-#define ELF_E_UNKNOWN_VERSION_IDX (ELF_E_NOERROR_IDX + sizeof "no error")
+#define ELF_E_UNKNOWN_ERROR_IDX (ELF_E_NOERROR_IDX + sizeof "no error")
+  N_("unknown error")
+  "\0"
+#define ELF_E_UNKNOWN_VERSION_IDX \
+  (ELF_E_UNKNOWN_ERROR_IDX + sizeof "unknown error")
   N_("unknown version")
   "\0"
 #define ELF_E_UNKNOWN_TYPE_IDX \
@@ -260,6 +252,7 @@ static const char msgstr[] =
 static const uint_fast16_t msgidx[ELF_E_NUM] =
 {
   [ELF_E_NOERROR] = ELF_E_NOERROR_IDX,
+  [ELF_E_UNKNOWN_ERROR] = ELF_E_UNKNOWN_ERROR_IDX,
   [ELF_E_UNKNOWN_VERSION] = ELF_E_UNKNOWN_VERSION_IDX,
   [ELF_E_UNKNOWN_TYPE] = ELF_E_UNKNOWN_TYPE_IDX,
   [ELF_E_INVALID_HANDLE] = ELF_E_INVALID_HANDLE_IDX,
@@ -300,6 +293,25 @@ static const uint_fast16_t msgidx[ELF_E_NUM] =
   [ELF_E_GROUP_NOT_REL] = ELF_E_GROUP_NOT_REL_IDX,
   [ELF_E_INVALID_PHDR] = ELF_E_INVALID_PHDR_IDX
 };
+#define nmsgidx ((int) (sizeof (msgidx) / sizeof (msgidx[0])))
+
+
+void
+__libelf_seterrno (value)
+     int value;
+{
+#ifndef USE_TLS
+  /* If we have not yet initialized the buffer do it now.  */
+  once_execute (once, init);
+
+  if (threaded)
+    /* We do not allocate memory for the data.  It is only a word.
+       We can store it in place of the pointer.  */
+    setspecific (key, (void *) (intptr_t) value);
+#endif /* TLS */
+
+  global_error = value >= 0 && value < nmsgidx ? value : ELF_E_UNKNOWN_ERROR;
+}
 
 
 /*@-mods@*/
@@ -308,6 +320,7 @@ elf_errmsg (int error)
 {
   int last_error;
 
+#ifndef USE_TLS
   /* If we have not yet initialized the buffer do it now.  */
   once_execute (once, init);
 
@@ -316,6 +329,7 @@ elf_errmsg (int error)
        We can store it in place of the pointer.  */
     last_error = (intptr_t) getspecific (key);
   else
+#endif /* TLS */
     last_error = global_error;
 
   if (error == 0)
@@ -323,8 +337,8 @@ elf_errmsg (int error)
       assert (msgidx[last_error] < sizeof (msgstr));
       return last_error != 0 ? _(msgstr + msgidx[last_error]) : NULL;
     }
-  else if (error < -1)
-    return _("Unknown error");
+  else if (error < -1 || error >= nmsgidx)
+    return _(msgstr + ELF_E_UNKNOWN_ERROR_IDX);
 
   assert (msgidx[error == -1 ? last_error : error] < sizeof (msgstr));
   return _(msgstr + msgidx[error == -1 ? last_error : error]);
@@ -332,6 +346,7 @@ elf_errmsg (int error)
 /*@=mods@*/
 
 
+#ifndef USE_TLS
 /* Free the thread specific data, this is done if a thread terminates.  */
 static void
 free_key_mem (void *mem)
@@ -348,3 +363,4 @@ init (void)
     /* Creating the key succeeded.  */
     threaded = true;
 }
+#endif /* TLS */
index 0179da8..4f2b81d 100644 (file)
@@ -37,9 +37,11 @@ elf_flagelf (Elf *elf, Elf_Cmd cmd, unsigned int flags)
     }
 
   if (likely (cmd == ELF_C_SET))
-    result = (elf->flags |= (flags & (ELF_F_DIRTY | ELF_F_LAYOUT)));
+    result = (elf->flags
+             |= (flags & (ELF_F_DIRTY | ELF_F_LAYOUT | ELF_F_PERMISSIVE)));
   else if (likely (cmd == ELF_C_CLR))
-    result = (elf->flags &= ~(flags & (ELF_F_DIRTY | ELF_F_LAYOUT)));
+    result = (elf->flags
+             &= ~(flags & (ELF_F_DIRTY | ELF_F_LAYOUT | ELF_F_PERMISSIVE)));
   else
     {
       __libelf_seterrno (ELF_E_INVALID_COMMAND);
index ac3e7ce..9975820 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "libelfP.h"
 #include "common.h"
+#include "../libebl/elf-knowledge.h"
 
 #if _STRING_ARCH_unaligned
 # define ALLOW_ALIGNED 1
@@ -212,11 +213,22 @@ __libelf_set_rawdata (Elf_Scn *scn)
   if (size != 0 && type != SHT_NOBITS)
     {
       /* First a test whether the section is valid at all.  */
+      size_t entsize;
+
+      if (type == SHT_HASH)
+       {
+         GElf_Ehdr ehdr_mem;
+
+         entsize = SH_ENTSIZE_HASH (gelf_getehdr (elf, &ehdr_mem));
+       }
+      else
+       {
 #if EV_NUM != 2
-      size_t entsize = shtype_map[__libelf_version - 1][elf->class - 1][TYPEIDX (type)].size;
+         entsize = shtype_map[__libelf_version - 1][elf->class - 1][TYPEIDX (type)].size;
 #else
-      size_t entsize = shtype_map[0][elf->class - 1][TYPEIDX (type)].size;
+         entsize = shtype_map[0][elf->class - 1][TYPEIDX (type)].size;
 #endif
+       }
 
       /* We assume it is an array of bytes if it is none of the structured
         sections we know of.  */
@@ -276,12 +288,25 @@ __libelf_set_rawdata (Elf_Scn *scn)
     }
 
   scn->rawdata.d.d_size = size;
+  /* Some broken ELF ABI for 64-bit machines use the wrong hash table
+     entry size.  See elf-knowledge.h for more information.  */
+  if (type == SHT_HASH && elf->class == ELFCLASS64)
+    {
+      GElf_Ehdr ehdr_mem;
+
+      scn->rawdata.d.d_type = (SH_ENTSIZE_HASH (gelf_getehdr (elf, &ehdr_mem))
+                              == 4 ? ELF_T_WORD : ELF_T_XWORD);
+    }
+  else
+    {
 #if EV_NUM != 2
-  scn->rawdata.d.d_type =
-    shtype_map[__libelf_version - 1][elf->class - 1][TYPEIDX (type)].type;
+      scn->rawdata.d.d_type =
+       shtype_map[__libelf_version - 1][elf->class - 1][TYPEIDX (type)].type;
 #else
-  scn->rawdata.d.d_type = shtype_map[0][elf->class - 1][TYPEIDX (type)].type;
+      scn->rawdata.d.d_type =
+       shtype_map[0][elf->class - 1][TYPEIDX (type)].type;
 #endif
+    }
   scn->rawdata.d.d_off = 0;
   scn->rawdata.d.d_align = align;
   if (elf->class == ELFCLASS32
index eefad0b..e717f27 100644 (file)
@@ -64,10 +64,13 @@ gelf_getphdr (Elf *elf, int ndx, GElf_Phdr *dst)
          goto out;
        }
 
+      /* We know the result now.  */
+      result = dst;
+
       /* Now correct the pointer to point to the correct element.  */
       phdr += ndx;
 
-#define COPY(Name) dst->Name = phdr->Name
+#define COPY(Name) result->Name = phdr->Name
       COPY (p_type);
       COPY (p_offset);
       COPY (p_vaddr);
@@ -98,11 +101,9 @@ gelf_getphdr (Elf *elf, int ndx, GElf_Phdr *dst)
        }
 
       /* We only have to copy the data.  */
-      memcpy (dst, phdr + ndx, sizeof (GElf_Phdr));
+      result = memcpy (dst, phdr + ndx, sizeof (GElf_Phdr));
     }
 
-  result = dst;
-
  out:
   rwlock_unlock (elf->lock);
 
index 2f33b8d..0fdd90d 100644 (file)
@@ -24,7 +24,7 @@ FUNDAMENTAL (XWORD, Xword, LIBELFBITS);
 FUNDAMENTAL (SXWORD, Sxword, LIBELFBITS);
 /*@=mods@*/
 
-/* The strctured types.  */
+/* The structured types.  */
 /*@-modunconnomods -noeffectuncon@*/
 TYPE (Ehdr, LIBELFBITS)
 TYPE (Phdr, LIBELFBITS)
index adf8db4..327bf81 100644 (file)
@@ -89,9 +89,11 @@ typedef enum
 enum
 {
   ELF_F_DIRTY = 0x1,
-#define ELF_F_DIRTY    ELF_F_DIRTY
-  ELF_F_LAYOUT = 0x4
-#define ELF_F_LAYOUT   ELF_F_LAYOUT
+#define ELF_F_DIRTY            ELF_F_DIRTY
+  ELF_F_LAYOUT = 0x4,
+#define ELF_F_LAYOUT           ELF_F_LAYOUT
+  ELF_F_PERMISSIVE = 0x8
+#define ELF_F_PERMISSIVE       ELF_F_PERMISSIVE
 };
 
 
index d0b9ff1..d8f36d3 100644 (file)
@@ -77,6 +77,7 @@ enum
 enum
 {
   ELF_E_NOERROR = 0,
+  ELF_E_UNKNOWN_ERROR,
   ELF_E_UNKNOWN_VERSION,
   ELF_E_UNKNOWN_TYPE,
   ELF_E_INVALID_HANDLE,
index 40bc675..eb2c1da 100644 (file)
@@ -7,7 +7,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2002-11-30 00:56-0800\n"
+"POT-Creation-Date: 2003-02-19 13:48-0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -20,7 +20,7 @@ msgstr ""
 msgid "memory exhausted"
 msgstr ""
 
-#: src/nm.c:58 src/readelf.c:49
+#: src/nm.c:58 src/readelf.c:49 src/strip.c:56
 msgid "Output selection:"
 msgstr ""
 
@@ -82,7 +82,7 @@ msgstr ""
 msgid "Print size of defined symbols"
 msgstr ""
 
-#: src/nm.c:77 src/size.c:61
+#: src/nm.c:77 src/size.c:61 src/strip.c:60
 msgid "Output options:"
 msgstr ""
 
@@ -106,17 +106,17 @@ msgstr ""
 msgid "List symbols from FILEs (a.out by default)."
 msgstr ""
 
-#: src/nm.c:89 src/size.c:72 src/strip.c:65
+#: src/nm.c:89 src/size.c:72 src/strip.c:75
 msgid "[FILE...]"
 msgstr ""
 
-#: src/nm.c:117 src/size.c:100 src/strip.c:88
+#: src/nm.c:117 src/size.c:100 src/strip.c:98
 #, c-format
 msgid "%s: INTERNAL ERROR: %s"
 msgstr ""
 
-#: src/nm.c:233 src/readelf.c:348 src/size.c:202 src/strip.c:161 src/ld.c:786
-#: src/elflint.c:211
+#: src/nm.c:233 src/readelf.c:348 src/size.c:202 src/strip.c:177 src/ld.c:786
+#: src/elflint.c:221
 #, c-format
 msgid ""
 "Copyright (C) %s Red Hat, Inc.\n"
@@ -124,14 +124,14 @@ msgid ""
 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
 msgstr ""
 
-#: src/nm.c:238 src/readelf.c:353 src/size.c:207 src/strip.c:166 src/ld.c:791
-#: src/elflint.c:216
+#: src/nm.c:238 src/readelf.c:353 src/size.c:207 src/strip.c:182 src/ld.c:791
+#: src/elflint.c:226
 #, c-format
 msgid "Written by %s.\n"
 msgstr ""
 
-#: src/nm.c:341 src/readelf.c:335 src/size.c:283 src/strip.c:206
-#: src/elflint.c:198
+#: src/nm.c:341 src/readelf.c:335 src/size.c:283 src/strip.c:230
+#: src/elflint.c:208
 msgid "Report bugs to <drepper@redhat.com>.\n"
 msgstr ""
 
@@ -140,7 +140,7 @@ msgstr ""
 msgid "while close `%s'"
 msgstr ""
 
-#: src/nm.c:400 src/strip.c:279
+#: src/nm.c:400 src/strip.c:303
 #, c-format
 msgid "%s: File format not recognized"
 msgstr ""
@@ -172,9 +172,9 @@ msgstr ""
 
 #: src/nm.c:792 src/nm.c:1174 src/readelf.c:661 src/readelf.c:791
 #: src/readelf.c:875 src/readelf.c:1059 src/readelf.c:1279 src/readelf.c:1431
-#: src/readelf.c:1605 src/readelf.c:1862 src/readelf.c:1938 src/readelf.c:2026
-#: src/readelf.c:2306 src/readelf.c:3723 src/size.c:424 src/size.c:498
-#: src/strip.c:390
+#: src/readelf.c:1605 src/readelf.c:1864 src/readelf.c:1941 src/readelf.c:2029
+#: src/readelf.c:2309 src/readelf.c:3726 src/size.c:424 src/size.c:498
+#: src/strip.c:428
 msgid "cannot get section header string table index"
 msgstr ""
 
@@ -277,25 +277,25 @@ msgstr ""
 msgid "Print information from ELF file in human-readable form."
 msgstr ""
 
-#: src/readelf.c:75 src/elflint.c:60
+#: src/readelf.c:75 src/elflint.c:62
 msgid "FILE..."
 msgstr ""
 
-#: src/readelf.c:213 src/elflint.c:131
+#: src/readelf.c:213 src/elflint.c:133
 msgid "cannot open input file"
 msgstr ""
 
-#: src/readelf.c:220 src/elflint.c:138
+#: src/readelf.c:220 src/elflint.c:140
 #, c-format
 msgid "cannot generate Elf descriptor: %s\n"
 msgstr ""
 
-#: src/readelf.c:228 src/elflint.c:148
+#: src/readelf.c:228 src/elflint.c:158
 #, c-format
 msgid "error while closing Elf descriptor: %s"
 msgstr ""
 
-#: src/readelf.c:408 src/elflint.c:270
+#: src/readelf.c:408 src/elflint.c:281
 #, c-format
 msgid " error while freeing sub-ELF descriptor: %s\n"
 msgstr ""
@@ -308,11 +308,11 @@ msgstr ""
 msgid "input file is empty"
 msgstr ""
 
-#: src/readelf.c:421 src/elflint.c:278
+#: src/readelf.c:421 src/elflint.c:289
 msgid "Not an ELF file - it has the wrong magic bytes at the start"
 msgstr ""
 
-#: src/readelf.c:448 src/elflint.c:1941
+#: src/readelf.c:448 src/elflint.c:2021
 #, c-format
 msgid "cannot read ELF header: %s"
 msgstr ""
@@ -321,7 +321,7 @@ msgstr ""
 msgid "cannot create EBL handle"
 msgstr ""
 
-#: src/readelf.c:462 src/strip.c:447 src/ldgeneric.c:578 src/ldgeneric.c:969
+#: src/readelf.c:462 src/strip.c:485 src/ldgeneric.c:575 src/ldgeneric.c:966
 #, c-format
 msgid "cannot determine number of sections: %s"
 msgstr ""
@@ -557,10 +557,10 @@ msgstr ""
 #, c-format
 msgid ""
 "\n"
-"COMDAT section group [%2d] '%s' with signature '%s' contains %zu entry:\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
 msgid_plural ""
 "\n"
-"COMDAT section group [%2d] '%s' with signature '%s' contains %zu entries:\n"
+"COMDAT section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
 msgstr[0] ""
 msgstr[1] ""
 
@@ -568,10 +568,10 @@ msgstr[1] ""
 #, c-format
 msgid ""
 "\n"
-"Section group [%2d] '%s' with signature '%s' contains %zu entry:\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entry:\n"
 msgid_plural ""
 "\n"
-"Section group [%2d] '%s' with signature '%s' contains %zu entries:\n"
+"Section group [%2zu] '%s' with signature '%s' contains %zu entries:\n"
 msgstr[0] ""
 msgstr[1] ""
 
@@ -581,7 +581,7 @@ msgstr ""
 
 #: src/readelf.c:905
 #, c-format
-msgid "  [%2d] <INVALID SECTION>\n"
+msgid "  [%2u] <INVALID SECTION>\n"
 msgstr ""
 
 #: src/readelf.c:910
@@ -593,11 +593,11 @@ msgstr ""
 msgid ""
 "\n"
 "Dynamic segment contains %lu entry:\n"
-" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2d] '%s'\n"
+" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] '%s'\n"
 msgid_plural ""
 "\n"
 "Dynamic segment contains %lu entries:\n"
-" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2d] '%s'\n"
+" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] '%s'\n"
 msgstr[0] ""
 msgstr[1] ""
 
@@ -641,11 +641,11 @@ msgstr ""
 #, c-format
 msgid ""
 "\n"
-"Relocation section [%2d] '%s' for section [%2d] '%s' at offset %#0*<PRIx64> "
+"Relocation section [%2u] '%s' for section [%2u] '%s' at offset %#0*<PRIx64> "
 "contains %d entry:\n"
 msgid_plural ""
 "\n"
-"Relocation section [%2d] '%s' for section [%2d] '%s' at offset %#0*<PRIx64> "
+"Relocation section [%2u] '%s' for section [%2u] '%s' at offset %#0*<PRIx64> "
 "contains %d entries:\n"
 msgstr[0] ""
 msgstr[1] ""
@@ -675,11 +675,11 @@ msgstr ""
 #, c-format
 msgid ""
 "\n"
-"Relocation section '%s' for section [%2d] '%s' at offset %#0*<PRIx64> "
+"Relocation section '%s' for section [%2u] '%s' at offset %#0*<PRIx64> "
 "contains %d entry:\n"
 msgid_plural ""
 "\n"
-"Relocation section '%s' for section [%2d] '%s' at offset %#0*<PRIx64> "
+"Relocation section '%s' for section [%2u] '%s' at offset %#0*<PRIx64> "
 "contains %d entries:\n"
 msgstr[0] ""
 msgstr[1] ""
@@ -696,175 +696,180 @@ msgstr ""
 #, c-format
 msgid ""
 "\n"
-"Symbol table [%2d] '%s' contains %d entry:\n"
+"Symbol table [%2u] '%s' contains %u entry:\n"
 msgid_plural ""
 "\n"
-"Symbol table [%2d] '%s' contains %d entries:\n"
+"Symbol table [%2u] '%s' contains %u entries:\n"
 msgstr[0] ""
 msgstr[1] ""
 
 #: src/readelf.c:1616
 #, c-format
-msgid " %lu local symbol  String table: [%2d] '%s'\n"
-msgid_plural " %lu local symbols  String table: [%2d] '%s'\n"
+msgid " %lu local symbol  String table: [%2u] '%s'\n"
+msgid_plural " %lu local symbols  String table: [%2u] '%s'\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:1625
+#: src/readelf.c:1626
 msgid "  Num:    Value   Size Type    Bind   Vis          Ndx Name\n"
 msgstr ""
 
-#: src/readelf.c:1627
+#: src/readelf.c:1628
 msgid "  Num:            Value   Size Type    Bind   Vis          Ndx Name\n"
 msgstr ""
 
-#: src/readelf.c:1736
+#: src/readelf.c:1648
+#, c-format
+msgid "%5u: %0*<PRIx64> %6<PRId64> %-7s %-6s %-9s %6s %s"
+msgstr ""
+
+#: src/readelf.c:1738
 msgid "bad dynamic symbol"
 msgstr ""
 
-#: src/readelf.c:1819
+#: src/readelf.c:1821
 msgid "none"
 msgstr ""
 
-#: src/readelf.c:1836
+#: src/readelf.c:1838
 msgid "| <unknown>"
 msgstr ""
 
-#: src/readelf.c:1864
+#: src/readelf.c:1866
 #, c-format
 msgid ""
 "\n"
-"Version needs section [%2d] '%s' contains %d entry:\n"
-" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2d] '%s'\n"
+"Version needs section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] '%s'\n"
 msgid_plural ""
 "\n"
-"Version needs section [%2d] '%s' contains %d entries:\n"
-" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2d] '%s'\n"
+"Version needs section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] '%s'\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:1891
+#: src/readelf.c:1893
 #, c-format
-msgid "  %#06x: Version: %hd  File: %s  Cnt: %hd\n"
+msgid "  %#06x: Version: %hu  File: %s  Cnt: %hu\n"
 msgstr ""
 
-#: src/readelf.c:1906
+#: src/readelf.c:1908
 #, c-format
-msgid "  %#06x: Name: %s  Flags: %s  Version: %hd\n"
+msgid "  %#06x: Name: %s  Flags: %s  Version: %hu\n"
 msgstr ""
 
-#: src/readelf.c:1940
+#: src/readelf.c:1943
 #, c-format
 msgid ""
 "\n"
-"Version definition section [%2d] '%s' contains %d entry:\n"
-" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2d] '%s'\n"
+"Version definition section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] '%s'\n"
 msgid_plural ""
 "\n"
-"Version definition section [%2d] '%s' contains %d entries:\n"
-" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2d] '%s'\n"
+"Version definition section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] '%s'\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:1975
+#: src/readelf.c:1978
 #, c-format
 msgid "  %#06x: Version: %hd  Flags: %s  Index: %hd  Cnt: %hd  Name: %s\n"
 msgstr ""
 
-#: src/readelf.c:1990
+#: src/readelf.c:1993
 #, c-format
 msgid "  %#06x: Parent %d: %s\n"
 msgstr ""
 
-#: src/readelf.c:2238
+#: src/readelf.c:2241
 #, c-format
 msgid ""
 "\n"
-"Version symbols section [%2d] '%s' contains %d entry:\n"
-" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2d] '%s'"
+"Version symbols section [%2u] '%s' contains %d entry:\n"
+" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] '%s'"
 msgid_plural ""
 "\n"
-"Version symbols section [%2d] '%s' contains %d entries:\n"
-" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2d] '%s'"
+"Version symbols section [%2u] '%s' contains %d entries:\n"
+" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] '%s'"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:2270
+#: src/readelf.c:2273
 msgid "   0 *local*                     "
 msgstr ""
 
-#: src/readelf.c:2275
+#: src/readelf.c:2278
 msgid "   1 *global*                    "
 msgstr ""
 
-#: src/readelf.c:2331
+#: src/readelf.c:2334
 #, c-format
 msgid "cannot get data for section %d: %s"
 msgstr ""
 
-#: src/readelf.c:2341
+#: src/readelf.c:2344
 #, c-format
 msgid ""
 "\n"
-"Histogram for bucket list length in section [%2d] '%s' (total of %d "
+"Histogram for bucket list length in section [%2u] '%s' (total of %d "
 "bucket):\n"
-" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2d] '%s'\n"
+" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] '%s'\n"
 msgid_plural ""
 "\n"
-"Histogram for bucket list length in section [%2d] '%s' (total of %d "
+"Histogram for bucket list length in section [%2u] '%s' (total of %d "
 "buckets):\n"
-" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2d] '%s'\n"
+" Addr: %#0*<PRIx64>  Offset: %#08<PRIx64>  Link to section: [%2u] '%s'\n"
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:2386
+#: src/readelf.c:2389
 #, c-format
 msgid " Length  Number  % of total  Coverage"
 msgstr ""
 
-#: src/readelf.c:2387
+#: src/readelf.c:2390
 #, c-format
 msgid "      0  %6<PRIu32>      %5.1f%%\n"
 msgstr ""
 
-#: src/readelf.c:2393
+#: src/readelf.c:2396
 #, c-format
 msgid "%7d  %6<PRIu32>      %5.1f%%    %5.1f%%\n"
 msgstr ""
 
-#: src/readelf.c:2407
+#: src/readelf.c:2410
 #, c-format
 msgid ""
 " Average number of tests:   successful lookup: %f\n"
 "                          unsuccessful lookup: %f\n"
 msgstr ""
 
-#: src/readelf.c:2504
+#: src/readelf.c:2507
 #, c-format
 msgid "unknown tag %hx"
 msgstr ""
 
-#: src/readelf.c:2506
+#: src/readelf.c:2509
 #, c-format
 msgid "unknown user tag %hx"
 msgstr ""
 
-#: src/readelf.c:2689
+#: src/readelf.c:2692
 #, c-format
 msgid "unknown attribute %hx"
 msgstr ""
 
-#: src/readelf.c:2692
+#: src/readelf.c:2695
 #, c-format
 msgid "unknown user attribute %hx"
 msgstr ""
 
-#: src/readelf.c:2738
+#: src/readelf.c:2741
 #, c-format
 msgid "unknown form %<PRIx64>"
 msgstr ""
 
-#: src/readelf.c:3110
+#: src/readelf.c:3113
 #, c-format
 msgid ""
 "\n"
@@ -872,50 +877,50 @@ msgid ""
 " [ Code]\n"
 msgstr ""
 
-#: src/readelf.c:3133
+#: src/readelf.c:3136
 #, c-format
 msgid " *** error while reading abbreviation: %s\n"
 msgstr ""
 
-#: src/readelf.c:3144
+#: src/readelf.c:3147
 #, c-format
 msgid " *** error while reading abbreviation code: %s\n"
 msgstr ""
 
-#: src/readelf.c:3151
+#: src/readelf.c:3154
 #, c-format
 msgid " *** error while reading abbreviation tag: %s\n"
 msgstr ""
 
-#: src/readelf.c:3159
+#: src/readelf.c:3162
 #, c-format
 msgid " *** error while reading abbreviation children flag: %s\n"
 msgstr ""
 
-#: src/readelf.c:3165
+#: src/readelf.c:3168
 #, c-format
 msgid " [%5<PRId64>] offset: %<PRId64>, children: %s, tag: %s\n"
 msgstr ""
 
-#: src/readelf.c:3168
+#: src/readelf.c:3171
 msgid "yes"
 msgstr ""
 
-#: src/readelf.c:3168
+#: src/readelf.c:3171
 msgid "no"
 msgstr ""
 
-#: src/readelf.c:3183
+#: src/readelf.c:3186
 #, c-format
 msgid " *** error while reading abbreviation entries: %s\n"
 msgstr ""
 
-#: src/readelf.c:3207
+#: src/readelf.c:3210
 #, c-format
 msgid "cannot get .debug_aranges content: %s"
 msgstr ""
 
-#: src/readelf.c:3212 src/readelf.c:3645
+#: src/readelf.c:3215 src/readelf.c:3648
 #, c-format
 msgid ""
 "\n"
@@ -926,19 +931,19 @@ msgid_plural ""
 msgstr[0] ""
 msgstr[1] ""
 
-#: src/readelf.c:3227 src/readelf.c:3660
+#: src/readelf.c:3230 src/readelf.c:3663
 #, c-format
 msgid " [%5<PRId64>] ???\n"
 msgstr ""
 
-#: src/readelf.c:3229
+#: src/readelf.c:3232
 #, c-format
 msgid ""
 " [%5<PRId64>] start: %0#*<PRIx64>, length: %5<PRIu64>, CU DIE offset: %"
 "6<PRId64>\n"
 msgstr ""
 
-#: src/readelf.c:3253
+#: src/readelf.c:3256
 #, c-format
 msgid ""
 "\n"
@@ -946,12 +951,12 @@ msgid ""
 " [Offset]\n"
 msgstr ""
 
-#: src/readelf.c:3281
+#: src/readelf.c:3284
 #, c-format
 msgid "cannot get CU header in section '%s': %s"
 msgstr ""
 
-#: src/readelf.c:3286
+#: src/readelf.c:3289
 #, c-format
 msgid ""
 " Compilation unit at offset %<PRIu64>:\n"
@@ -959,70 +964,70 @@ msgid ""
 "<PRIu16>\n"
 msgstr ""
 
-#: src/readelf.c:3298
+#: src/readelf.c:3301
 #, c-format
 msgid "cannot get DIE at offset %<PRIu64> in section '%s': %s"
 msgstr ""
 
-#: src/readelf.c:3308
+#: src/readelf.c:3311
 #, c-format
 msgid "cannot get DIE offset: %s"
 msgstr ""
 
-#: src/readelf.c:3316
+#: src/readelf.c:3319
 #, c-format
 msgid "cannot get tag of DIE at offset %<PRIu64> in section '%s': %s"
 msgstr ""
 
-#: src/readelf.c:3415
+#: src/readelf.c:3418
 #, c-format
 msgid "cannot get attributes of DIE: %s"
 msgstr ""
 
-#: src/readelf.c:3427
+#: src/readelf.c:3430
 #, c-format
 msgid "cannot get attribute code: %s"
 msgstr ""
 
-#: src/readelf.c:3435
+#: src/readelf.c:3438
 #, c-format
 msgid "cannot get attribute form: %s"
 msgstr ""
 
-#: src/readelf.c:3448
+#: src/readelf.c:3451
 #, c-format
 msgid "cannot get attribute value: %s"
 msgstr ""
 
-#: src/readelf.c:3576
+#: src/readelf.c:3579
 #, c-format
 msgid "cannot get next DIE: %s\n"
 msgstr ""
 
-#: src/readelf.c:3583
+#: src/readelf.c:3586
 #, c-format
 msgid "cannot get next DIE: %s"
 msgstr ""
 
-#: src/readelf.c:3611 src/readelf.c:3621
+#: src/readelf.c:3614 src/readelf.c:3624
 #, c-format
 msgid ""
 "\n"
 "DWARF section '%s' at offset %#<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:3640
+#: src/readelf.c:3643
 #, c-format
 msgid "cannot get .debug_pubnames content: %s"
 msgstr ""
 
-#: src/readelf.c:3662
+#: src/readelf.c:3665
 #, c-format
 msgid ""
 " [%5<PRId64>] DIE offset: %6<PRId64>, CU DIE offset: %6<PRId64>, name: %s\n"
 msgstr ""
 
-#: src/readelf.c:3684
+#: src/readelf.c:3687
 #, c-format
 msgid ""
 "\n"
@@ -1030,33 +1035,33 @@ msgid ""
 " [Offset]  String\n"
 msgstr ""
 
-#: src/readelf.c:3696
+#: src/readelf.c:3699
 #, c-format
 msgid " *** error while reading strings: %s\n"
 msgstr ""
 
-#: src/readelf.c:3715
+#: src/readelf.c:3718
 #, c-format
 msgid "cannot get debug context descriptor: %s"
 msgstr ""
 
-#: src/readelf.c:3789
+#: src/readelf.c:3792
 #, c-format
 msgid ""
 "\n"
 "Note segment of %<PRId64> bytes at offset %#0*<PRIx64>:\n"
 msgstr ""
 
-#: src/readelf.c:3796
+#: src/readelf.c:3799
 #, c-format
 msgid "cannot get content of note section: %s"
 msgstr ""
 
-#: src/readelf.c:3799
+#: src/readelf.c:3802
 msgid "  Owner          Data size  Type\n"
 msgstr ""
 
-#: src/readelf.c:3837
+#: src/readelf.c:3841
 #, c-format
 msgid "  %-13.*s  %9<PRId32>  %s\n"
 msgstr ""
@@ -1132,96 +1137,108 @@ msgstr ""
 msgid "(TOTALS)\n"
 msgstr ""
 
-#: src/strip.c:54
+#: src/strip.c:57
 msgid "Place stripped output into FILE"
 msgstr ""
 
-#: src/strip.c:55
+#: src/strip.c:58
 msgid "Extract the removed sections into FILE"
 msgstr ""
 
-#: src/strip.c:56
+#: src/strip.c:61
+msgid "Remove all debugging symbols"
+msgstr ""
+
+#: src/strip.c:63
 msgid "Copy modified/access timestamps to the output"
 msgstr ""
 
-#: src/strip.c:57
+#: src/strip.c:65
 msgid "Remove .comment section"
 msgstr ""
 
-#: src/strip.c:62
+#: src/strip.c:67
+msgid "Relax a few rules to handle slightly broken ELF files"
+msgstr ""
+
+#: src/strip.c:72
 msgid "Discard symbols from object files."
 msgstr ""
 
-#: src/strip.c:143
+#: src/strip.c:159
 msgid "Only one input file allowed together with '-o' and '-f'"
 msgstr ""
 
-#: src/strip.c:227
+#: src/strip.c:251
 #, c-format
 msgid "cannot stat input file \"%s\""
 msgstr ""
 
-#: src/strip.c:235
+#: src/strip.c:259
 #, c-format
 msgid "while opening \"%s\""
 msgstr ""
 
-#: src/strip.c:260
+#: src/strip.c:284
 #, c-format
 msgid "cannot set access and modification date of \"%s\""
 msgstr ""
 
-#: src/strip.c:364 src/strip.c:376
+#: src/strip.c:388 src/strip.c:414
 #, c-format
 msgid "cannot open `%s'"
 msgstr ""
 
-#: src/strip.c:399 src/strip.c:425
+#: src/strip.c:401
+msgid "cannot open EBL backend"
+msgstr ""
+
+#: src/strip.c:437 src/strip.c:463
 #, c-format
 msgid "cannot create new file `%s': %s"
 msgstr ""
 
-#: src/strip.c:486
+#: src/strip.c:524
 #, c-format
 msgid "illformed file `%s'"
 msgstr ""
 
-#: src/strip.c:750 src/strip.c:835
+#: src/strip.c:788 src/strip.c:873
 #, c-format
 msgid "while generating output file: %s"
 msgstr ""
 
-#: src/strip.c:799 src/strip.c:1180
+#: src/strip.c:837 src/strip.c:1218
 #, c-format
 msgid "%s: error while creating ELF header: %s"
 msgstr ""
 
-#: src/strip.c:807 src/strip.c:1201
+#: src/strip.c:845 src/strip.c:1240
 #, c-format
 msgid "while writing `%s': %s"
 msgstr ""
 
-#: src/strip.c:822
+#: src/strip.c:860
 #, c-format
 msgid "while preparing output for `%s'"
 msgstr ""
 
-#: src/strip.c:876 src/strip.c:933
+#: src/strip.c:914 src/strip.c:971
 #, c-format
 msgid "while create section header section: %s"
 msgstr ""
 
-#: src/strip.c:882
+#: src/strip.c:920
 #, c-format
 msgid "cannot allocate section data: %s"
 msgstr ""
 
-#: src/strip.c:1188
+#: src/strip.c:1226
 #, c-format
 msgid "%s: error while reading the file: %s"
 msgstr ""
 
-#: src/strip.c:1215 src/strip.c:1222
+#: src/strip.c:1254 src/strip.c:1261
 #, c-format
 msgid "error while finishing `%s': %s"
 msgstr ""
@@ -1501,270 +1518,270 @@ msgstr ""
 msgid "cannot read version script \"%s\""
 msgstr ""
 
-#: src/ldgeneric.c:164 src/ldgeneric.c:4088
+#: src/ldgeneric.c:162 src/ldgeneric.c:4038
 msgid "cannot create string table"
 msgstr ""
 
-#: src/ldgeneric.c:209
+#: src/ldgeneric.c:206
 #, c-format
 msgid "cannot load ld backend library '%s': %s"
 msgstr ""
 
-#: src/ldgeneric.c:218
+#: src/ldgeneric.c:215
 #, c-format
 msgid "cannot find init function in ld backend library '%s': %s"
 msgstr ""
 
-#: src/ldgeneric.c:253
+#: src/ldgeneric.c:250
 #, c-format
 msgid "%s listed more than once as input"
 msgstr ""
 
-#: src/ldgeneric.c:374
+#: src/ldgeneric.c:371
 #, c-format
 msgid "%s (for -l%s)\n"
 msgstr ""
 
-#: src/ldgeneric.c:375
+#: src/ldgeneric.c:372
 #, c-format
 msgid "%s (for DT_NEEDED %s)\n"
 msgstr ""
 
-#: src/ldgeneric.c:465
+#: src/ldgeneric.c:462
 #, c-format
 msgid "cannot open %s"
 msgstr ""
 
-#: src/ldgeneric.c:487
+#: src/ldgeneric.c:484
 #, c-format
 msgid "Warning: type of `%s' changed from %s in %s to %s in %s"
 msgstr ""
 
-#: src/ldgeneric.c:500
+#: src/ldgeneric.c:497
 #, c-format
 msgid "Warning: size of `%s' changed from %<PRIu64> in %s to %<PRIu64> in %s"
 msgstr ""
 
-#: src/ldgeneric.c:595
+#: src/ldgeneric.c:592
 #, c-format
 msgid "(%s+%#<PRIx64>): multiple definition of %s `%s'\n"
 msgstr ""
 
-#: src/ldgeneric.c:625
+#: src/ldgeneric.c:622
 #, c-format
 msgid "(%s+%#<PRIx64>): first defined here\n"
 msgstr ""
 
-#: src/ldgeneric.c:714
+#: src/ldgeneric.c:711
 #, c-format
 msgid "%s: cannot get section group data: %s"
 msgstr ""
 
-#: src/ldgeneric.c:735
+#: src/ldgeneric.c:732
 #, c-format
 msgid "%s: section '%s' with group flag set does not belong to any group"
 msgstr ""
 
-#: src/ldgeneric.c:779
+#: src/ldgeneric.c:776
 #, c-format
 msgid "%s: section [%2d] '%s' is in more than one section group"
 msgstr ""
 
-#: src/ldgeneric.c:995 src/ldgeneric.c:1189 src/ldgeneric.c:1198
-#: src/ldgeneric.c:1257 src/ldgeneric.c:1266 src/ldgeneric.c:1516
-#: src/ldgeneric.c:1855
+#: src/ldgeneric.c:992 src/ldgeneric.c:1186 src/ldgeneric.c:1195
+#: src/ldgeneric.c:1254 src/ldgeneric.c:1263 src/ldgeneric.c:1513
+#: src/ldgeneric.c:1852
 #, c-format
 msgid "%s: invalid ELF file (%s:%d)\n"
 msgstr ""
 
-#: src/ldgeneric.c:1089
+#: src/ldgeneric.c:1086
 #, c-format
 msgid "%s: only files of type ET_REL might contain section groups"
 msgstr ""
 
-#: src/ldgeneric.c:1123
+#: src/ldgeneric.c:1120
 #, c-format
-msgid "%s: cannot determine signature of section group [%2d] '%s': %s"
+msgid "%s: cannot determine signature of section group [%2zd] '%s': %s"
 msgstr ""
 
-#: src/ldgeneric.c:1142
+#: src/ldgeneric.c:1139
 #, c-format
 msgid "%s: section '%s' has unknown type: %d"
 msgstr ""
 
-#: src/ldgeneric.c:1492
+#: src/ldgeneric.c:1489
 #, c-format
 msgid "cannot get descriptor for ELF file (%s:%d): %s\n"
 msgstr ""
 
-#: src/ldgeneric.c:1527
+#: src/ldgeneric.c:1524
 #, c-format
 msgid "cannot open \"%s\""
 msgstr ""
 
-#: src/ldgeneric.c:1669
+#: src/ldgeneric.c:1666
 #, c-format
 msgid "cannot read archive `%s': %s"
 msgstr ""
 
-#: src/ldgeneric.c:1685
+#: src/ldgeneric.c:1682
 #, c-format
 msgid "archive `%s' is too large"
 msgstr ""
 
-#: src/ldgeneric.c:1870
+#: src/ldgeneric.c:1867
 #, c-format
 msgid "file of type %s cannot be linked in\n"
 msgstr ""
 
-#: src/ldgeneric.c:1881
+#: src/ldgeneric.c:1878
 #, c-format
 msgid "%s: cannot get section header string table index: %s\n"
 msgstr ""
 
-#: src/ldgeneric.c:1913
+#: src/ldgeneric.c:1910
 #, c-format
 msgid "cannot use DSO '%s' when generating relocatable object file"
 msgstr ""
 
-#: src/ldgeneric.c:1998
+#: src/ldgeneric.c:1995
 #, c-format
 msgid "input file '%s' ignored"
 msgstr ""
 
-#: src/ldgeneric.c:2182
+#: src/ldgeneric.c:2179
 #, c-format
 msgid "undefined symbol `%s' in %s"
 msgstr ""
 
-#: src/ldgeneric.c:2552
+#: src/ldgeneric.c:2502
 msgid "cannot create output file"
 msgstr ""
 
-#: src/ldgeneric.c:2562
+#: src/ldgeneric.c:2512
 #, c-format
 msgid "cannot create ELF descriptor for output file: %s"
 msgstr ""
 
-#: src/ldgeneric.c:2569
+#: src/ldgeneric.c:2519
 #, c-format
 msgid "could not create ELF header for output file: %s"
 msgstr ""
 
-#: src/ldgeneric.c:2883 src/ldgeneric.c:2956 src/ldgeneric.c:2991
-#: src/ldgeneric.c:3516 src/ldgeneric.c:3565 src/ldgeneric.c:3598
-#: src/ldgeneric.c:3788 src/ldgeneric.c:3827 src/ldgeneric.c:4036
-#: src/ldgeneric.c:4068 src/ldgeneric.c:4478 src/ldgeneric.c:4488
+#: src/ldgeneric.c:2833 src/ldgeneric.c:2906 src/ldgeneric.c:2941
+#: src/ldgeneric.c:3466 src/ldgeneric.c:3515 src/ldgeneric.c:3548
+#: src/ldgeneric.c:3738 src/ldgeneric.c:3777 src/ldgeneric.c:3986
+#: src/ldgeneric.c:4018 src/ldgeneric.c:4428 src/ldgeneric.c:4438
 #, c-format
 msgid "cannot create section for output file: %s"
 msgstr ""
 
-#: src/ldgeneric.c:3108
+#: src/ldgeneric.c:3058
 #, c-format
 msgid "address computation expression contains variable '%s'"
 msgstr ""
 
-#: src/ldgeneric.c:3153
+#: src/ldgeneric.c:3103
 #, c-format
 msgid ""
 "argument '%<PRIuMAX>' of ALIGN in address computation expression is no power "
 "of two"
 msgstr ""
 
-#: src/ldgeneric.c:3328
+#: src/ldgeneric.c:3278
 #, c-format
 msgid "cannot find entry symbol \"%s\": defaulting to %#0*<PRIx64>"
 msgstr ""
 
-#: src/ldgeneric.c:3334
+#: src/ldgeneric.c:3284
 #, c-format
 msgid "no entry symbol specified: defaulting to %#0*<PRIx64>"
 msgstr ""
 
-#: src/ldgeneric.c:3413 src/ldgeneric.c:3434 src/ldgeneric.c:3463
-#: src/ldgeneric.c:5015
+#: src/ldgeneric.c:3363 src/ldgeneric.c:3384 src/ldgeneric.c:3413
+#: src/ldgeneric.c:4965
 #, c-format
 msgid "cannot create symbol table for output file: %s"
 msgstr ""
 
-#: src/ldgeneric.c:4200 src/ldgeneric.c:4727
+#: src/ldgeneric.c:4150 src/ldgeneric.c:4677
 msgid "section index too large in dynamic symbol table"
 msgstr ""
 
-#: src/ldgeneric.c:4616
+#: src/ldgeneric.c:4566
 #, c-format
 msgid "cannot create versioning section: %s"
 msgstr ""
 
-#: src/ldgeneric.c:4693
+#: src/ldgeneric.c:4643
 #, c-format
 msgid "cannot create dynamic symbol table for output file: %s"
 msgstr ""
 
-#: src/ldgeneric.c:4829
+#: src/ldgeneric.c:4779
 #, c-format
 msgid "cannot create hash table section for output file: %s"
 msgstr ""
 
-#: src/ldgeneric.c:4907
+#: src/ldgeneric.c:4857
 #, c-format
 msgid "cannot create versioning data: %s"
 msgstr ""
 
-#: src/ldgeneric.c:5047 src/ldgeneric.c:5060 src/ldgeneric.c:5124
-#: src/ldgeneric.c:5132
+#: src/ldgeneric.c:4997 src/ldgeneric.c:5010 src/ldgeneric.c:5074
+#: src/ldgeneric.c:5082
 #, c-format
 msgid "cannot create section header string section: %s"
 msgstr ""
 
-#: src/ldgeneric.c:5054
+#: src/ldgeneric.c:5004
 msgid "cannot create section header string section"
 msgstr ""
 
-#: src/ldgeneric.c:5208
+#: src/ldgeneric.c:5158
 #, c-format
 msgid "cannot create program header: %s"
 msgstr ""
 
-#: src/ldgeneric.c:5216
+#: src/ldgeneric.c:5166
 #, c-format
 msgid "while determining file layout: %s"
 msgstr ""
 
-#: src/ldgeneric.c:5765
+#: src/ldgeneric.c:5715
 #, c-format
 msgid "cannot get header of 0th section: %s"
 msgstr ""
 
-#: src/ldgeneric.c:5781
+#: src/ldgeneric.c:5731
 #, c-format
 msgid "cannot update ELF header: %s"
 msgstr ""
 
-#: src/ldgeneric.c:5802
+#: src/ldgeneric.c:5752
 msgid "linker backend didn't specify function to relocate section"
 msgstr ""
 
-#: src/ldgeneric.c:5814
+#: src/ldgeneric.c:5764
 #, c-format
 msgid "while writing output file: %s"
 msgstr ""
 
-#: src/ldgeneric.c:5819
+#: src/ldgeneric.c:5769
 #, c-format
 msgid "while finishing output file: %s"
 msgstr ""
 
-#: src/ldgeneric.c:5830
+#: src/ldgeneric.c:5780
 msgid "cannot change access mode of output file"
 msgstr ""
 
-#: src/ldgeneric.c:5839
+#: src/ldgeneric.c:5789
 msgid "cannot rename output file"
 msgstr ""
 
-#: src/ldgeneric.c:5887 src/ldgeneric.c:5898 src/ldgeneric.c:5909
-#: src/ldgeneric.c:5927 src/ldgeneric.c:5940 src/ldgeneric.c:5952
+#: src/ldgeneric.c:5837 src/ldgeneric.c:5848 src/ldgeneric.c:5859
+#: src/ldgeneric.c:5877 src/ldgeneric.c:5890 src/ldgeneric.c:5902
 #, c-format
 msgid "no machine specific '%s' implementation"
 msgstr ""
@@ -1773,684 +1790,697 @@ msgstr ""
 msgid "mode for segment invalid\n"
 msgstr ""
 
-#: src/ldscript.y:438
+#: src/ldscript.y:440
 #, c-format
 msgid "while reading version script: %s at line %d\n"
 msgstr ""
 
-#: src/ldscript.y:441
+#: src/ldscript.y:443
 #, c-format
 msgid "while reading linker script: %s at line %d\n"
 msgstr ""
 
-#: src/ldscript.y:700
+#: src/ldscript.y:702
 #, c-format
 msgid "symbol '%s' in declared both local and global for unnamed version"
 msgstr ""
 
-#: src/ldscript.y:702
+#: src/ldscript.y:704
 #, c-format
 msgid "symbol '%s' in declared both local and global for version '%s'"
 msgstr ""
 
-#: src/ldscript.y:722 src/ldscript.y:729
+#: src/ldscript.y:724 src/ldscript.y:731
 msgid "default visibility set as local and global"
 msgstr ""
 
-#: src/elflint.c:50
+#: src/elflint.c:52
 msgid "Be extremely strict, flag level 2 features."
 msgstr ""
 
-#: src/elflint.c:51
+#: src/elflint.c:53
 msgid "Do not print anything if successful"
 msgstr ""
 
-#: src/elflint.c:56
+#: src/elflint.c:58
 msgid "Pedantic checking of ELF files compliance with gABI/psABI spec."
 msgstr ""
 
-#: src/elflint.c:152
+#: src/elflint.c:162
 msgid "No errors"
 msgstr ""
 
-#: src/elflint.c:327 src/elflint.c:329 src/elflint.c:331 src/elflint.c:333
+#: src/elflint.c:338 src/elflint.c:340 src/elflint.c:342 src/elflint.c:344
 #, c-format
 msgid "e_ident[%d] != '%c'"
 msgstr ""
 
-#: src/elflint.c:337
+#: src/elflint.c:348
 #, c-format
 msgid "e_ident[%d] == %d is no known class"
 msgstr ""
 
-#: src/elflint.c:342
+#: src/elflint.c:353
 #, c-format
 msgid "e_ident[%d] == %d is no known data encoding"
 msgstr ""
 
-#: src/elflint.c:347
+#: src/elflint.c:358
 #, c-format
 msgid "unknown ELF header version number e_ident[%d] == %d"
 msgstr ""
 
-#: src/elflint.c:352
+#: src/elflint.c:363
 #, c-format
 msgid "unsupported OS ABI e_ident[%d] == \"%s\""
 msgstr ""
 
-#: src/elflint.c:358
+#: src/elflint.c:369
 #, c-format
 msgid "unsupport ABI version e_ident[%d] == %d"
 msgstr ""
 
-#: src/elflint.c:363
+#: src/elflint.c:374
 #, c-format
 msgid "e_ident[%d] is not zero"
 msgstr ""
 
-#: src/elflint.c:368
+#: src/elflint.c:379
 #, c-format
 msgid "unknown object file type %d"
 msgstr ""
 
-#: src/elflint.c:375
+#: src/elflint.c:386
 #, c-format
 msgid "unknown machine type %d"
 msgstr ""
 
-#: src/elflint.c:379
+#: src/elflint.c:390
 msgid "unknown object file version"
 msgstr ""
 
-#: src/elflint.c:385
+#: src/elflint.c:396
 msgid "invalid program header offset"
 msgstr ""
 
-#: src/elflint.c:387
+#: src/elflint.c:398
 msgid "executables and DSOs cannot have zero program header offset"
 msgstr ""
 
-#: src/elflint.c:391
+#: src/elflint.c:402
 msgid "invalid number of program header entries"
 msgstr ""
 
-#: src/elflint.c:399
+#: src/elflint.c:410
 msgid "invalid section header table offset"
 msgstr ""
 
-#: src/elflint.c:402
+#: src/elflint.c:413
 msgid "section header table must be present"
 msgstr ""
 
-#: src/elflint.c:418
+#: src/elflint.c:429
 msgid "invalid number of section header table entries"
 msgstr ""
 
-#: src/elflint.c:437 src/elflint.c:443
+#: src/elflint.c:448 src/elflint.c:454
 msgid "invalid section header index"
 msgstr ""
 
-#: src/elflint.c:448
+#: src/elflint.c:459
 #, c-format
 msgid "invalid machine flags: %s"
 msgstr ""
 
-#: src/elflint.c:455 src/elflint.c:468
+#: src/elflint.c:466 src/elflint.c:483
 #, c-format
 msgid "invalid ELF header size: %hd"
 msgstr ""
 
-#: src/elflint.c:458 src/elflint.c:471
+#: src/elflint.c:469 src/elflint.c:486
 #, c-format
 msgid "invalid program header size: %hd"
 msgstr ""
 
-#: src/elflint.c:462 src/elflint.c:475
+#: src/elflint.c:472 src/elflint.c:489
+msgid "invalid program header position or size"
+msgstr ""
+
+#: src/elflint.c:475 src/elflint.c:492
 #, c-format
 msgid "invalid section header size: %hd"
 msgstr ""
 
-#: src/elflint.c:525
+#: src/elflint.c:478 src/elflint.c:495
+msgid "invalid section header position or size"
+msgstr ""
+
+#: src/elflint.c:544
 #, c-format
 msgid ""
 "section [%2d] '%s': section with SHF_GROUP flag set not part of a section "
 "group"
 msgstr ""
 
-#: src/elflint.c:529
+#: src/elflint.c:548
 #, c-format
 msgid ""
 "section [%2d] '%s': section group [%2d] '%s' does not preceed group member"
 msgstr ""
 
-#: src/elflint.c:564 src/elflint.c:751 src/elflint.c:837 src/elflint.c:974
-#: src/elflint.c:1213
+#: src/elflint.c:583 src/elflint.c:770 src/elflint.c:856 src/elflint.c:993
+#: src/elflint.c:1232
 #, c-format
 msgid "section [%2d] '%s': cannot get section data"
 msgstr ""
 
-#: src/elflint.c:570 src/elflint.c:981
+#: src/elflint.c:589 src/elflint.c:1000
 #, c-format
 msgid ""
 "section [%2d] '%s': referenced as string table for section [%2d] '%s' but "
 "type is not SHT_STRTAB"
 msgstr ""
 
-#: src/elflint.c:598
+#: src/elflint.c:617
 #, c-format
 msgid "section [%2d] '%s': entry size is does not match ElfXX_Sym"
 msgstr ""
 
-#: src/elflint.c:605 src/elflint.c:645
+#: src/elflint.c:624 src/elflint.c:664
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol %d: %s"
 msgstr ""
 
-#: src/elflint.c:611 src/elflint.c:615 src/elflint.c:619 src/elflint.c:623
-#: src/elflint.c:627 src/elflint.c:631
+#: src/elflint.c:630 src/elflint.c:634 src/elflint.c:638 src/elflint.c:642
+#: src/elflint.c:646 src/elflint.c:650
 #, c-format
 msgid "section [%2d] '%s': '%s' in zeroth entry not zero"
 msgstr ""
 
-#: src/elflint.c:634
+#: src/elflint.c:653
 #, c-format
 msgid "section [%2d] '%s': XINDEX for zeroth entry not zero"
 msgstr ""
 
-#: src/elflint.c:652
+#: src/elflint.c:671
 #, c-format
 msgid "section [%2d] '%s': symbol %d: invalid name value"
 msgstr ""
 
-#: src/elflint.c:659
+#: src/elflint.c:678
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: too large section index but no extended "
 "section index section"
 msgstr ""
 
-#: src/elflint.c:664
+#: src/elflint.c:683
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: XINDEX used for index which would fit in "
 "st_shndx (%<PRIu32>)"
 msgstr ""
 
-#: src/elflint.c:676
+#: src/elflint.c:695
 #, c-format
 msgid "section [%2d] '%s': symbol %d: invalid section index"
 msgstr ""
 
-#: src/elflint.c:683
+#: src/elflint.c:702
 #, c-format
 msgid "section [%2d] '%s': symbol %d: unknown type"
 msgstr ""
 
-#: src/elflint.c:687
+#: src/elflint.c:706
 #, c-format
 msgid "section [%2d] '%s': symbol %d: unknow symbol binding"
 msgstr ""
 
-#: src/elflint.c:699
+#: src/elflint.c:718
 #, c-format
 msgid "section [%2d] '%s': symbol %d: st_value out of bounds"
 msgstr ""
 
-#: src/elflint.c:707
+#: src/elflint.c:726
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: local symbol outside range described in "
 "sh_info"
 msgstr ""
 
-#: src/elflint.c:714
+#: src/elflint.c:733
 #, c-format
 msgid ""
 "section [%2d] '%s': symbol %d: non-local symbol outside range described in "
 "sh_info"
 msgstr ""
 
-#: src/elflint.c:721
+#: src/elflint.c:740
 #, c-format
 msgid "section [%2d] '%s': symbol %d: non-local section symbol"
 msgstr ""
 
-#: src/elflint.c:759 src/elflint.c:845
+#: src/elflint.c:778 src/elflint.c:864
 #, c-format
 msgid "section [%2d] '%s': invalid destination section index"
 msgstr ""
 
-#: src/elflint.c:769 src/elflint.c:855
+#: src/elflint.c:788 src/elflint.c:874
 #, c-format
 msgid "section [%2d] '%s': invalid destination section type"
 msgstr ""
 
-#: src/elflint.c:775
+#: src/elflint.c:794
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Rela"
 msgstr ""
 
-#: src/elflint.c:790 src/elflint.c:876
+#: src/elflint.c:809 src/elflint.c:895
 #, c-format
 msgid "section [%2d] '%s': cannot get relocation %d: %s"
 msgstr ""
 
-#: src/elflint.c:797 src/elflint.c:883
+#: src/elflint.c:816 src/elflint.c:902
 #, c-format
 msgid "section [%2d] '%s': relocation %d: invalid type"
 msgstr ""
 
-#: src/elflint.c:804 src/elflint.c:890
+#: src/elflint.c:823 src/elflint.c:909
 #, c-format
 msgid "section [%2d] '%s': relocation %d: invalid symbol index"
 msgstr ""
 
-#: src/elflint.c:810 src/elflint.c:897
+#: src/elflint.c:829 src/elflint.c:916
 #, c-format
 msgid "section [%2d] '%s': relocation %d: offset out of bounds"
 msgstr ""
 
-#: src/elflint.c:861
+#: src/elflint.c:880
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Rel"
 msgstr ""
 
-#: src/elflint.c:964
+#: src/elflint.c:983
 msgid "more than one dynamic section present"
 msgstr ""
 
-#: src/elflint.c:987
+#: src/elflint.c:1006
 #, c-format
 msgid "section [%2d] '%s': section entry size does not match ElfXX_Dyn"
 msgstr ""
 
-#: src/elflint.c:992 src/elflint.c:1146
+#: src/elflint.c:1011 src/elflint.c:1165
 #, c-format
 msgid "section [%2d] '%s': sh_info not zero"
 msgstr ""
 
-#: src/elflint.c:1003
+#: src/elflint.c:1022
 #, c-format
 msgid "section [%2d] '%s': cannot get dynamic section entry %d: %s"
 msgstr ""
 
-#: src/elflint.c:1010
+#: src/elflint.c:1029
 #, c-format
 msgid "section [%2d] '%s': entry %d: unknown tag"
 msgstr ""
 
-#: src/elflint.c:1021
+#: src/elflint.c:1040
 #, c-format
 msgid "section [%2d] '%s': entry %d: more than one entry with tag %s"
 msgstr ""
 
-#: src/elflint.c:1031
+#: src/elflint.c:1050
 #, c-format
 msgid "section [%2d] '%s': entry %d: level 2 tag %s used"
 msgstr ""
 
-#: src/elflint.c:1043
+#: src/elflint.c:1062
 #, c-format
 msgid "section [%2d] '%s': entry %d: DT_PLTREL value must be DT_REL or DT_RELA"
 msgstr ""
 
-#: src/elflint.c:1068
+#: src/elflint.c:1087
 #, c-format
 msgid "section [%2d] '%s': contains %s entry but not %s"
 msgstr ""
 
-#: src/elflint.c:1080
+#: src/elflint.c:1099
 #, c-format
 msgid "section [%2d] '%s': mandatory tag %s not present"
 msgstr ""
 
-#: src/elflint.c:1090 src/elflint.c:1097
+#: src/elflint.c:1109 src/elflint.c:1116
 #, c-format
 msgid "section [%2d] '%s': not all of %s, %s, and %s are present"
 msgstr ""
 
-#: src/elflint.c:1126
+#: src/elflint.c:1145
 #, c-format
 msgid "section [%2d] '%s': extended section index section not for symbol table"
 msgstr ""
 
-#: src/elflint.c:1131
+#: src/elflint.c:1150
 msgid "cannot get data for symbol section"
 msgstr ""
 
-#: src/elflint.c:1135 src/elflint.c:1225
+#: src/elflint.c:1154 src/elflint.c:1244
 #, c-format
 msgid "section [%2d] '%s': entry size does not match Elf32_Word"
 msgstr ""
 
-#: src/elflint.c:1141
+#: src/elflint.c:1160
 #, c-format
 msgid "section [%2d] '%s': extended index table too small for symbol table"
 msgstr ""
 
-#: src/elflint.c:1158
+#: src/elflint.c:1177
 #, c-format
 msgid ""
 "section [%2d] '%s': extended section index in section [%2d] '%s' refers to "
 "same symbol table"
 msgstr ""
 
-#: src/elflint.c:1169
+#: src/elflint.c:1188
 msgid "symbol 0 should have zero extended section index"
 msgstr ""
 
-#: src/elflint.c:1181
+#: src/elflint.c:1200
 #, c-format
 msgid "cannot get data for symbol %d"
 msgstr ""
 
-#: src/elflint.c:1186
+#: src/elflint.c:1205
 #, c-format
 msgid "extended section index is %<PRIu32> but symbol index is not XINDEX"
 msgstr ""
 
-#: src/elflint.c:1220
+#: src/elflint.c:1239
 #, c-format
 msgid "section [%2d] '%s': hash table not for dynamic symbol table"
 msgstr ""
 
-#: src/elflint.c:1230
+#: src/elflint.c:1249
 #, c-format
 msgid "section [%2d] '%s': not marked to be allocated"
 msgstr ""
 
-#: src/elflint.c:1235
+#: src/elflint.c:1254
 #, c-format
 msgid "section [%2d] '%s': hash table has not even room for nbucket and nchain"
 msgstr ""
 
-#: src/elflint.c:1245
+#: src/elflint.c:1264
 #, c-format
 msgid ""
 "section [%2d] '%s': hash table section is too small (is %ld, expected %ld)"
 msgstr ""
 
-#: src/elflint.c:1257
+#: src/elflint.c:1276
 #, c-format
 msgid "section [%2d] '%s': chain array not large enough"
 msgstr ""
 
-#: src/elflint.c:1262
+#: src/elflint.c:1281
 #, c-format
 msgid "section [%2d] '%s': hash bucket reference %d out of bounds"
 msgstr ""
 
-#: src/elflint.c:1268
+#: src/elflint.c:1287
 #, c-format
 msgid "section [%2d] '%s': hash chain reference %d out of bounds"
 msgstr ""
 
-#: src/elflint.c:1281
+#: src/elflint.c:1300
 #, c-format
 msgid "section [%2d] '%s': nonzero sh_%s for NULL section"
 msgstr ""
 
-#: src/elflint.c:1306
+#: src/elflint.c:1325
 #, c-format
 msgid "section [%2d] '%s': cannot get symbol table: %s"
 msgstr ""
 
-#: src/elflint.c:1311
+#: src/elflint.c:1330
 #, c-format
 msgid "section [%2d] '%s': section reference in sh_link is no symbol table"
 msgstr ""
 
-#: src/elflint.c:1317
+#: src/elflint.c:1336
 #, c-format
 msgid "section [%2d] '%s': invalid symbol index in sh_info"
 msgstr ""
 
-#: src/elflint.c:1322
+#: src/elflint.c:1341
 #, c-format
 msgid "section [%2d] '%s': sh_flags not zero"
 msgstr ""
 
-#: src/elflint.c:1328
+#: src/elflint.c:1347
 #, c-format
 msgid "section [%2d] '%s': sh_flags not set correctly"
 msgstr ""
 
-#: src/elflint.c:1334
+#: src/elflint.c:1353
 #, c-format
 msgid "section [%2d] '%s': cannot get data: %s"
 msgstr ""
 
-#: src/elflint.c:1343
+#: src/elflint.c:1362
 #, c-format
 msgid "section [%2d] '%s': section size not multiple of sizeof(Elf32_Word)"
 msgstr ""
 
-#: src/elflint.c:1348
+#: src/elflint.c:1367
 #, c-format
 msgid "section [%2d] '%s': section group without flags word"
 msgstr ""
 
-#: src/elflint.c:1354
+#: src/elflint.c:1373
 #, c-format
 msgid "section [%2d] '%s': section group without member"
 msgstr ""
 
-#: src/elflint.c:1358
+#: src/elflint.c:1377
 #, c-format
 msgid "section [%2d] '%s': section group with only one member"
 msgstr ""
 
-#: src/elflint.c:1370
+#: src/elflint.c:1389
 #, c-format
 msgid "section [%2d] '%s': unknown section group flags"
 msgstr ""
 
-#: src/elflint.c:1382
+#: src/elflint.c:1401
 #, c-format
 msgid "section [%2d] '%s': section index %Zu out of range"
 msgstr ""
 
-#: src/elflint.c:1393
+#: src/elflint.c:1412
 #, c-format
 msgid "section [%2d] '%s': cannot get section header for element %Zu: %s"
 msgstr ""
 
-#: src/elflint.c:1400
+#: src/elflint.c:1419
 #, c-format
 msgid "section [%2d] '%s': section group contains another group [%2d] '%s'"
 msgstr ""
 
-#: src/elflint.c:1406
+#: src/elflint.c:1425
 #, c-format
 msgid ""
 "section [%2d] '%s': element %Zu references section [%2d] '%s' without "
 "SHF_GROUP flag set"
 msgstr ""
 
-#: src/elflint.c:1413
+#: src/elflint.c:1432
 #, c-format
 msgid "section [%2d] '%s' is contained in more than one section group"
 msgstr ""
 
-#: src/elflint.c:1544
+#: src/elflint.c:1563
 msgid "cannot get section header of zeroth section"
 msgstr ""
 
-#: src/elflint.c:1548
+#: src/elflint.c:1567
 msgid "zeroth section has nonzero name"
 msgstr ""
 
-#: src/elflint.c:1550
+#: src/elflint.c:1569
 msgid "zeroth section has nonzero type"
 msgstr ""
 
-#: src/elflint.c:1552
+#: src/elflint.c:1571
 msgid "zeroth section has nonzero flags"
 msgstr ""
 
-#: src/elflint.c:1554
+#: src/elflint.c:1573
 msgid "zeroth section has nonzero address"
 msgstr ""
 
-#: src/elflint.c:1556
+#: src/elflint.c:1575
 msgid "zeroth section has nonzero offset"
 msgstr ""
 
-#: src/elflint.c:1558
+#: src/elflint.c:1577
 msgid "zeroth section has nonzero info field"
 msgstr ""
 
-#: src/elflint.c:1560
+#: src/elflint.c:1579
 msgid "zeroth section has nonzero align value"
 msgstr ""
 
-#: src/elflint.c:1562
+#: src/elflint.c:1581
 msgid "zeroth section has nonzero entry size value"
 msgstr ""
 
-#: src/elflint.c:1565
+#: src/elflint.c:1584
 msgid ""
 "zeroth section has nonzero size value while ELF header has nonzero shnum "
 "value"
 msgstr ""
 
-#: src/elflint.c:1568
+#: src/elflint.c:1587
 msgid ""
 "zeroth section has nonzero link value while ELF header does not signal "
 "overflow in shstrndx"
 msgstr ""
 
-#: src/elflint.c:1579
+#: src/elflint.c:1598
 #, c-format
 msgid "cannot get section header for section [%2d] '%s': %s"
 msgstr ""
 
-#: src/elflint.c:1588
+#: src/elflint.c:1607
 #, c-format
 msgid "section [%2d]: invalid name"
 msgstr ""
 
-#: src/elflint.c:1603
+#: src/elflint.c:1622
 #, c-format
-msgid "section [%2d] '%s' has wrong type: expected %s, is %s"
+msgid "section [%2zd] '%s' has wrong type: expected %s, is %s"
 msgstr ""
 
-#: src/elflint.c:1618
+#: src/elflint.c:1637
 #, c-format
 msgid "section [%2d] '%s' has wrong flags: expected %s, is %s"
 msgstr ""
 
-#: src/elflint.c:1636
+#: src/elflint.c:1655
 #, c-format
 msgid "section [%2d] '%s' has wrong flags: expected %s and possibly %s, is %s"
 msgstr ""
 
-#: src/elflint.c:1666
+#: src/elflint.c:1685
 #, c-format
 msgid ""
 "section [%2d] '%s' has SHF_ALLOC flag set but there is no loadable segment"
 msgstr ""
 
-#: src/elflint.c:1671
+#: src/elflint.c:1690
 #, c-format
 msgid ""
 "section [%2d] '%s' has SHF_ALLOC flag not set but there are loadable segments"
 msgstr ""
 
-#: src/elflint.c:1681
+#: src/elflint.c:1700
 #, c-format
 msgid "section [%2d] '%s': size not multiple of entry size"
 msgstr ""
 
-#: src/elflint.c:1686
+#: src/elflint.c:1705
 msgid "cannot get section header"
 msgstr ""
 
-#: src/elflint.c:1694
+#: src/elflint.c:1713
 #, c-format
 msgid "unsupported section type %d"
 msgstr ""
 
-#: src/elflint.c:1700
+#: src/elflint.c:1719
 #, c-format
 msgid "section [%2d] '%s' contain unknown flag"
 msgstr ""
 
-#: src/elflint.c:1703
+#: src/elflint.c:1722
 #, c-format
 msgid "section [%2d] '%s': thread-local data sections not yet supported"
 msgstr ""
 
-#: src/elflint.c:1708
+#: src/elflint.c:1727
 #, c-format
 msgid "section [%2d] '%s': invalid section reference in link value"
 msgstr ""
 
-#: src/elflint.c:1713
+#: src/elflint.c:1732
 #, c-format
 msgid "section [%2d] '%s': invalid section reference in info value"
 msgstr ""
 
-#: src/elflint.c:1720
+#: src/elflint.c:1739
 #, c-format
 msgid "section [%2d] '%s': strings flag set without merge flag"
 msgstr ""
 
-#: src/elflint.c:1725
+#: src/elflint.c:1744
 #, c-format
 msgid "section [%2d] '%s': merge flag set but entry size is zero"
 msgstr ""
 
-#: src/elflint.c:1733
+#: src/elflint.c:1752
 #, c-format
 msgid ""
 "section [%2d] '%s': ELF header says this is the section header string table "
 "but type is not SHT_TYPE"
 msgstr ""
 
-#: src/elflint.c:1779
+#: src/elflint.c:1798
 msgid "INTERP program header entry but no .interp section"
 msgstr ""
 
-#: src/elflint.c:1789
+#: src/elflint.c:1808
 #, c-format
 msgid "phdr[%d]: no note entries defined for the type of file"
 msgstr ""
 
-#: src/elflint.c:1812
+#: src/elflint.c:1890
+#, c-format
+msgid "phdr[%d]: note entries probably in form of a 32-bit ELF file"
+msgstr ""
+
+#: src/elflint.c:1893
 #, c-format
 msgid "phdr[%d]: extra %zu bytes after last note"
 msgstr ""
 
-#: src/elflint.c:1841
+#: src/elflint.c:1922
 #, c-format
-msgid "phdr[%d]: unknown core file note type %<PRIu32> at offset %zd"
+msgid "phdr[%d]: unknown core file note type %<PRIu64> at offset %<PRIu64>"
 msgstr ""
 
-#: src/elflint.c:1849
+#: src/elflint.c:1930
 #, c-format
-msgid "phdr[%d]: unknown object file note type %<PRIu32> at offset %zd"
+msgid "phdr[%d]: unknown object file note type %<PRIu64> at offset %<PRIu64>"
 msgstr ""
 
-#: src/elflint.c:1876
+#: src/elflint.c:1956
 msgid ""
 "only executables, shared objects, and core files can have program headers"
 msgstr ""
 
-#: src/elflint.c:1887
+#: src/elflint.c:1967
 #, c-format
 msgid "cannot get program header entry %d: %s"
 msgstr ""
 
-#: src/elflint.c:1893
+#: src/elflint.c:1973
 #, c-format
 msgid "program header entry %d: unknown program header entry type"
 msgstr ""
 
-#: src/elflint.c:1904
+#: src/elflint.c:1984
 msgid "more than one INTERP entry in program header"
 msgstr ""
 
-#: src/elflint.c:1913
+#: src/elflint.c:1993
 msgid "more than one TLS entry in program header"
 msgstr ""