summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ChangeLog4
-rw-r--r--src/strip.c37
2 files changed, 25 insertions, 16 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index bd76256e..382a8f47 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,7 @@
+2021-01-08 Timm Bäder <[email protected]>
+
+ * strip.c (handle_elf): Expand inlined function check_preserved.
+
2021-01-12 Mark Wielaard <[email protected]>
* elflint.c (EXTRA_SHFLAGS): New define.
diff --git a/src/strip.c b/src/strip.c
index 7ce14ab8..c971b6c2 100644
--- a/src/strip.c
+++ b/src/strip.c
@@ -1535,25 +1535,30 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
files by setting the .debug_data pointer to the original
file's .data pointer. Below, we'll copy the section
contents. */
+ size_t shdr_indices[2] = { shdr_info[cnt].shdr.sh_link, 0 };
+ int n = 1;
- inline void check_preserved (size_t i)
- {
- if (i != 0 && i < shnum + 2 && shdr_info[i].idx != 0
- && shdr_info[i].debug_data == NULL)
- {
- if (shdr_info[i].data == NULL)
- shdr_info[i].data = elf_getdata (shdr_info[i].scn, NULL);
- if (shdr_info[i].data == NULL)
- INTERNAL_ERROR (fname);
+ if (SH_INFO_LINK_P (&shdr_info[cnt].shdr))
+ {
+ shdr_indices[1] = shdr_info[cnt].shdr.sh_info;
+ n++;
+ }
- shdr_info[i].debug_data = shdr_info[i].data;
- changes |= i < cnt;
- }
- }
+ for (int j = 0; j < n; j++)
+ {
+ size_t i = shdr_indices[j];
+ if (i != 0 && i < shnum + 2 && shdr_info[i].idx != 0
+ && shdr_info[i].debug_data == NULL)
+ {
+ if (shdr_info[i].data == NULL)
+ shdr_info[i].data = elf_getdata (shdr_info[i].scn, NULL);
+ if (shdr_info[i].data == NULL)
+ INTERNAL_ERROR (fname);
- check_preserved (shdr_info[cnt].shdr.sh_link);
- if (SH_INFO_LINK_P (&shdr_info[cnt].shdr))
- check_preserved (shdr_info[cnt].shdr.sh_info);
+ shdr_info[i].debug_data = shdr_info[i].data;
+ changes |= i < cnt;
+ }
+ }
}
}
}