summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChih-Hung Hsieh <chh@google.com>2015-10-14 10:15:48 -0700
committerMark Wielaard <mjw@redhat.com>2015-10-22 22:43:42 +0200
commit11659f252932ac2031209d6601d7e6d4cb66dc3f (patch)
treebae5806c19b50f874992663c4b54a2681ef3b060
parent239d859169543c21fcb43e27d4a81a9948a2b42d (diff)
downloadelfutils-11659f252932ac2031209d6601d7e6d4cb66dc3f.tar.gz
Move nested functions in libdwelf.
* Move nested functions to file scope in libdwelf/dwelf_elf_gnu_build_id.c to compile with clang. Signed-off-by: Chih-Hung Hsieh <chh@google.com>
-rw-r--r--libdwelf/ChangeLog5
-rw-r--r--libdwelf/dwelf_elf_gnu_build_id.c49
2 files changed, 34 insertions, 20 deletions
diff --git a/libdwelf/ChangeLog b/libdwelf/ChangeLog
index 342cb9cf..f182ecf4 100644
--- a/libdwelf/ChangeLog
+++ b/libdwelf/ChangeLog
@@ -1,3 +1,8 @@
+2015-10-14 Chih-Hung Hsieh <chh@google.com>
+
+ * dwelf_elf_gnu_build_id.c (find_elf_build_id): Move nested function
+ 'check_notes' to file scope.
+
2014-11-14 Mark Wielaard <mjw@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 1ed501d9..8c78c700 100644
--- a/libdwelf/dwelf_elf_gnu_build_id.c
+++ b/libdwelf/dwelf_elf_gnu_build_id.c
@@ -35,33 +35,36 @@
#define NO_VADDR ((GElf_Addr) -1l)
-/* Defined here for reuse. The dwelf interface doesn't care about the
- address of the note, but libdwfl does. */
static int
-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)
+check_notes (Elf_Data *data, GElf_Addr data_elfaddr,
+ 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"))
+ 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);
+ ? 0 : data_elfaddr + desc_pos);
*build_id_len = nhdr.n_descsz;
return 1;
}
- return 0;
- }
+ return 0;
+}
+/* Defined here for reuse. The dwelf interface doesn't care about the
+ address of the note, but libdwfl does. */
+static int
+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)
+{
size_t shstrndx = SHN_UNDEF;
int result = 0;
@@ -86,7 +89,10 @@ find_elf_build_id (Dwfl_Module *mod, int e_type, Elf *elf,
phdr->p_offset,
phdr->p_filesz,
ELF_T_NHDR),
- phdr->p_vaddr);
+ phdr->p_vaddr,
+ build_id_bits,
+ build_id_elfaddr,
+ build_id_len);
}
}
else
@@ -105,7 +111,10 @@ find_elf_build_id (Dwfl_Module *mod, int e_type, Elf *elf,
else if (__libdwfl_relocate_value (mod, elf, &shstrndx,
elf_ndxscn (scn), &vaddr))
vaddr = NO_VADDR;
- result = check_notes (elf_getdata (scn, NULL), vaddr);
+ result = check_notes (elf_getdata (scn, NULL), vaddr,
+ build_id_bits,
+ build_id_elfaddr,
+ build_id_len);
}
}
while (result == 0 && (scn = elf_nextscn (elf, scn)) != NULL);