54 lines
2.1 KiB
Diff
54 lines
2.1 KiB
Diff
|
commit 6f5934c1afa8f34bfb8f86b191ded9af854e757f
|
||
|
Author: Jan Kratochvil <jan.kratochvil@redhat.com>
|
||
|
Date: Sat Feb 7 15:08:20 2015 +0100
|
||
|
|
||
|
libelf: Consider sh_addralign 0 as 1
|
||
|
|
||
|
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>
|
||
|
|
||
|
diff --git a/libelf/elf32_updatenull.c b/libelf/elf32_updatenull.c
|
||
|
index be4cea0..5e809b7 100644
|
||
|
--- a/libelf/elf32_updatenull.c
|
||
|
+++ b/libelf/elf32_updatenull.c
|
||
|
@@ -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;
|