summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPingfan Liu <piliu@redhat.com>2022-03-31 13:59:34 +0800
committerSimon Horman <horms@verge.net.au>2022-04-01 15:54:56 +0200
commit2b78a27a64f097dd5d6e051c9a4b8a1b286c9ed0 (patch)
tree44f43d7b805bc338345859a4b2d7820de81956eb
parent1d8273d82b667d168939ba322adb5449d6171704 (diff)
downloadkexec-tools-2b78a27a64f097dd5d6e051c9a4b8a1b286c9ed0.tar.gz
kexec/elf: assign one to align if sh_addralign equals zero
According to ELF specification, if sh_addralign equals zero or one, then the section has no alignment requirement on the start address. (I.e. it can be aligned on 1 byte) Since modern cpu asks the .text, .data, .bss to be aligned on the machine word boundary at least, so in elf_rel_load(), sh_addralign can not be zero, and align = shdr->sh_addralign; ... bufsz = _ALIGN(bufsz, align); will not render a result of 'bufsz = 0'. But it had better have a check on the case of 'sh_addralign == 0' regardless of the assumption of machine word alignment. This patch has no functional change. Signed-off-by: Pingfan Liu <piliu@redhat.com> Signed-off-by: Simon Horman <horms@verge.net.au>
-rw-r--r--kexec/kexec-elf-rel.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/kexec/kexec-elf-rel.c b/kexec/kexec-elf-rel.c
index 9a6e63d..0a8b4d2 100644
--- a/kexec/kexec-elf-rel.c
+++ b/kexec/kexec-elf-rel.c
@@ -168,6 +168,10 @@ int build_elf_rel_info(const char *buf, off_t len, struct mem_ehdr *ehdr,
return 0;
}
+static unsigned long get_section_addralign(struct mem_shdr *shdr)
+{
+ return (shdr->sh_addralign == 0) ? 1 : shdr->sh_addralign;
+}
int elf_rel_load(struct mem_ehdr *ehdr, struct kexec_info *info,
unsigned long min, unsigned long max, int end)
@@ -219,7 +223,7 @@ int elf_rel_load(struct mem_ehdr *ehdr, struct kexec_info *info,
}
if (shdr->sh_type != SHT_NOBITS) {
unsigned long align;
- align = shdr->sh_addralign;
+ align = get_section_addralign(shdr);
/* See if I need more alignment */
if (buf_align < align) {
buf_align = align;
@@ -231,7 +235,7 @@ int elf_rel_load(struct mem_ehdr *ehdr, struct kexec_info *info,
}
else {
unsigned long align;
- align = shdr->sh_addralign;
+ align = get_section_addralign(shdr);
/* See if I need more alignment */
if (bss_align < align) {
bss_align = align;
@@ -265,7 +269,7 @@ int elf_rel_load(struct mem_ehdr *ehdr, struct kexec_info *info,
if (!(shdr->sh_flags & SHF_ALLOC)) {
continue;
}
- align = shdr->sh_addralign;
+ align = get_section_addralign(shdr);
if (shdr->sh_type != SHT_NOBITS) {
unsigned long off;
/* Adjust the address */