To be compiled without gnu99 extension.
Signed-off-by: Chih-Hung Hsieh <chh(a)google.com>
---
libdwelf/ChangeLog | 5 +++++
libdwelf/dwelf_elf_gnu_build_id.c | 42 +++++++++++++++++++++------------------
2 files changed, 28 insertions(+), 19 deletions(-)
diff --git a/libdwelf/ChangeLog b/libdwelf/ChangeLog
index 342cb9c..1300182 100644
--- a/libdwelf/ChangeLog
+++ b/libdwelf/ChangeLog
@@ -1,3 +1,8 @@
+2015-09-14 Chih-Hung Hsieh <chh(a)google.com>
+
+ * dwelf_elf_gnu_build_id.c (find_elf_build_id): Replace nested function
+ with macro.
+
2014-11-14 Mark Wielaard <mjw(a)redhat.com>
* dwelf_elf_gnu_debuglink.c (dwelf_elf_gnu_debuglink): Check d_buf
diff --git a/libdwelf/dwelf_elf_gnu_build_id.c b/libdwelf/dwelf_elf_gnu_build_id.c
index 1ed501d..cb20bca 100644
--- a/libdwelf/dwelf_elf_gnu_build_id.c
+++ b/libdwelf/dwelf_elf_gnu_build_id.c
@@ -42,25 +42,29 @@ find_elf_build_id (Dwfl_Module *mod, int e_type, Elf *elf,
const void **build_id_bits, GElf_Addr *build_id_elfaddr,
int *build_id_len)
{
- int check_notes (Elf_Data *data, GElf_Addr data_elfaddr)
- {
- size_t pos = 0;
- GElf_Nhdr nhdr;
- size_t name_pos;
- size_t desc_pos;
- while ((pos = gelf_getnote (data, pos, &nhdr, &name_pos, &desc_pos)) >
0)
- if (nhdr.n_type == NT_GNU_BUILD_ID
- && nhdr.n_namesz == sizeof "GNU" && !memcmp (data->d_buf
+ name_pos,
- "GNU", sizeof "GNU"))
- {
- *build_id_bits = data->d_buf + desc_pos;
- *build_id_elfaddr = (data_elfaddr == NO_VADDR
- ? 0 : data_elfaddr + desc_pos);
- *build_id_len = nhdr.n_descsz;
- return 1;
- }
- return 0;
- }
+#define check_notes(_data, _data_elfaddr) \
+ ( { \
+ Elf_Data *data = _data; \
+ GElf_Addr data_elfaddr = _data_elfaddr; \
+ int check_result = 0; \
+ size_t pos = 0; \
+ GElf_Nhdr nhdr; \
+ size_t name_pos; \
+ size_t desc_pos; \
+ while ((pos = gelf_getnote (data, pos, &nhdr, &name_pos, &desc_pos)) >
0) \
+ if (nhdr.n_type == NT_GNU_BUILD_ID \
+ && nhdr.n_namesz == sizeof "GNU" && !memcmp (data->d_buf
+ name_pos, \
+ "GNU", sizeof "GNU")) \
+ { \
+ *build_id_bits = data->d_buf + desc_pos; \
+ *build_id_elfaddr = (data_elfaddr == NO_VADDR \
+ ? 0 : data_elfaddr + desc_pos); \
+ *build_id_len = nhdr.n_descsz; \
+ check_result = 1; \
+ break; \
+ } \
+ check_result; \
+ } )
size_t shstrndx = SHN_UNDEF;
int result = 0;
--
2.6.0.rc0.131.gf624c3d