]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
libelf: Consider sh_addralign 0 as 1
authorJan Kratochvil <jan.kratochvil@redhat.com>
Sat, 7 Feb 2015 14:08:20 +0000 (15:08 +0100)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Sat, 7 Feb 2015 14:08:20 +0000 (15:08 +0100)
Currently the Koji build for arm32 fails with:
extracting debug info from /builddir/build/BUILDROOT/etcd-2.0.0-0.3.rc1.fc22.arm/usr/bin/etcd
Failed to write file: invalid section alignment

This is because the binary etcd
http://people.redhat.com/jkratoch/etcdctl.xz
contains:
Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [11] .rel.plt          REL             00459ee0 449ee0 000088 08   A 13   0  0
                                                                               ^
which corresponds to golang's code:
go/src/cmd/ld/elf.c
case EM_X86_64:
sh = elfshname(".rela.plt");
sh->addralign = RegSize;
default:
sh = elfshname(".rel.plt");
<nothing>

ELF spec says:
Values 0 and 1 mean the section has no alignment constraints.
and libelf/elf32_updatenull.c really parses it that way at line 204
ElfW2(LIBELFBITS,Word) sh_align = shdr->sh_addralign ?: 1;
but unfortunately the later line being patched no longer does.

libelf/
2015-02-07  Jan Kratochvil  <jan.kratochvil@redhat.com>

* elf32_updatenull.c (__elfw2(LIBELFBITS,updatenull_wrlock)): Consider
sh_addralign 0 as 1.

Signed-off-by: Jan Kratochvil <jan.kratochvil@redhat.com>
libelf/ChangeLog
libelf/elf32_updatenull.c

index f175630189c778341f318dee0adc16a0c54cc369..235b750b4c7afc2974c3e5cb9e7d942ba562c66e 100644 (file)
@@ -1,3 +1,8 @@
+2015-02-07  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * elf32_updatenull.c (__elfw2(LIBELFBITS,updatenull_wrlock)): Consider
+       sh_addralign 0 as 1.
+
 2015-01-22  Mark Wielaard  <mjw@redhat.com>
 
        * elf_strptr (elf_strptr): Make sure returned string is NUL
index be4cea03508db14bfb464d364c124fdd627b9482..5e809b79fcbb9f363a4035b0e9d58e05b56508fe 100644 (file)
@@ -328,7 +328,7 @@ __elfw2(LIBELFBITS,updatenull_wrlock) (Elf *elf, int *change_bop, size_t shnum)
                     enough for the largest alignment required by a data
                     block.  */
                  if (unlikely (! powerof2 (shdr->sh_addralign))
-                     || unlikely (shdr->sh_addralign < sh_align))
+                     || unlikely ((shdr->sh_addralign ?: 1) < sh_align))
                    {
                      __libelf_seterrno (ELF_E_INVALID_ALIGN);
                      return -1;