109 lines
3.7 KiB
Diff
109 lines
3.7 KiB
Diff
From 05d21996ba7b8cb7c8708ad8f7a6678d406e0936 Mon Sep 17 00:00:00 2001
|
|
From: Chih-Hung Hsieh <chh@google.com>
|
|
Date: Sun, 31 May 2020 14:03:51 +0100
|
|
Subject: [PATCH 2/3] Replace libdwfl nested functions with macros, part 1.
|
|
|
|
Prepare to compile with clang.
|
|
---
|
|
libdwfl/elf-from-memory.c | 77 +++++++++++++++++++++------------------
|
|
1 file changed, 42 insertions(+), 35 deletions(-)
|
|
|
|
diff --git a/libdwfl/elf-from-memory.c b/libdwfl/elf-from-memory.c
|
|
index c54c1b9..143e124 100644
|
|
--- a/libdwfl/elf-from-memory.c
|
|
+++ b/libdwfl/elf-from-memory.c
|
|
@@ -229,29 +229,33 @@ elf_from_remote_memory (GElf_Addr ehdr_vma,
|
|
segments_end, segments_end_mem and loadbase (if not
|
|
found_base yet). Returns true if sanity checking failed,
|
|
false otherwise. */
|
|
- inline bool handle_segment (GElf_Addr vaddr, GElf_Off offset,
|
|
- GElf_Xword filesz, GElf_Xword memsz)
|
|
- {
|
|
- /* Sanity check the segment load aligns with the pagesize. */
|
|
- if (((vaddr - offset) & (pagesize - 1)) != 0)
|
|
- return true;
|
|
-
|
|
- GElf_Off segment_end = ((offset + filesz + pagesize - 1)
|
|
- & -pagesize);
|
|
-
|
|
- if (segment_end > (GElf_Off) contents_size)
|
|
- contents_size = segment_end;
|
|
-
|
|
- if (!found_base && (offset & -pagesize) == 0)
|
|
- {
|
|
- loadbase = ehdr_vma - (vaddr & -pagesize);
|
|
- found_base = true;
|
|
- }
|
|
-
|
|
- segments_end = offset + filesz;
|
|
- segments_end_mem = offset + memsz;
|
|
- return false;
|
|
- }
|
|
+ #define handle_segment(_vaddr, _offset, _filesz, _memsz) \
|
|
+ ( { \
|
|
+ bool result; \
|
|
+ GElf_Addr vaddr = _vaddr; \
|
|
+ GElf_Off offset = _offset; \
|
|
+ GElf_Xword filesz = _filesz; \
|
|
+ GElf_Xword memsz = _memsz; \
|
|
+ /* Sanity check the segment load aligns with the pagesize. */ \
|
|
+ if (((vaddr - offset) & (pagesize - 1)) != 0) \
|
|
+ result = true; \
|
|
+ else \
|
|
+ { \
|
|
+ result = false; \
|
|
+ GElf_Off segment_end = ((offset + filesz + pagesize - 1) \
|
|
+ & -pagesize); \
|
|
+ if (segment_end > (GElf_Off) contents_size) \
|
|
+ contents_size = segment_end; \
|
|
+ if (!found_base && (offset & -pagesize) == 0) \
|
|
+ { \
|
|
+ loadbase = ehdr_vma - (vaddr & -pagesize); \
|
|
+ found_base = true; \
|
|
+ } \
|
|
+ segments_end = offset + filesz; \
|
|
+ segments_end_mem = offset + memsz; \
|
|
+ } \
|
|
+ result; \
|
|
+ } )
|
|
|
|
case ELFCLASS32:
|
|
if (elf32_xlatetom (&xlateto, &xlatefrom,
|
|
@@ -309,18 +313,21 @@ elf_from_remote_memory (GElf_Addr ehdr_vma,
|
|
{
|
|
/* Reads the given segment. Returns true if reading fails,
|
|
false otherwise. */
|
|
- inline bool handle_segment (GElf_Addr vaddr, GElf_Off offset,
|
|
- GElf_Xword filesz)
|
|
- {
|
|
- GElf_Off start = offset & -pagesize;
|
|
- GElf_Off end = (offset + filesz + pagesize - 1) & -pagesize;
|
|
- if (end > (GElf_Off) contents_size)
|
|
- end = contents_size;
|
|
- nread = (*read_memory) (arg, buffer + start,
|
|
- (loadbase + vaddr) & -pagesize,
|
|
- end - start, end - start);
|
|
- return nread <= 0;
|
|
- }
|
|
+ #undef handle_segment
|
|
+ #define handle_segment(_vaddr, _offset, _filesz) \
|
|
+ ( { \
|
|
+ GElf_Addr vaddr = _vaddr; \
|
|
+ GElf_Off offset = _offset; \
|
|
+ GElf_Xword filesz = _filesz; \
|
|
+ GElf_Off start = offset & -pagesize; \
|
|
+ GElf_Off end = (offset + filesz + pagesize - 1) & -pagesize; \
|
|
+ if (end > (GElf_Off) contents_size) \
|
|
+ end = contents_size; \
|
|
+ nread = (*read_memory) (arg, buffer + start, \
|
|
+ (loadbase + vaddr) & -pagesize, \
|
|
+ end - start, end - start); \
|
|
+ (nread <= 0); \
|
|
+ } )
|
|
|
|
case ELFCLASS32:
|
|
for (uint_fast16_t i = 0; i < phnum; ++i)
|
|
--
|
|
2.26.2
|
|
|