[PATCH] Introduce dwfl_module_getsym_info and dwfl_module_addrinfo.

Mark Wielaard mjw at redhat.com
Fri Dec 20 09:37:38 UTC 2013


On Wed, 2013-12-18 at 11:41 +0100, Mark Wielaard wrote:
> On Sat, 2013-12-14 at 23:59 +0100, Mark Wielaard wrote:
> > Extra testcases were added for both addr2line and the dwflsyms testscase.
> 
> I added some more tests based on the already existing dwflsyms testcases
> for separate debuginfo, minisymtab and prelinked files, but now
> generated on ppc64. Which revealed a couple of corner case issues. In
> particular when retrying to match the (resolved) value in
> dwfl_module_addrinfo we need to first check the address is actually
> larger than the one we are looking for. And we needed to keep better
> track of the elf file the symbol is defined in, which we always want to
> return to the user if requested, but we possibly want to check the
> address against the main elf file to check the section matches. For this
> last issue a resolved flag was introduced.
> 
> Besides these fixes, a rebase on master, a NEWS update and the new tests
> the patch is the same as the previous one. (Also on mjw/opd branch.)

I pushed this variant to master now. It helped find several other bugs
in the unwinder [testcases] (on ppc64) as reported on the list, but I
didn't find any new issues with the actual code.

Cheers,

Mark

> From f4e15a20d5fa276ae6d7aa3e450eab9bec7f3415 Mon Sep 17 00:00:00 2001
> From: Mark Wielaard <mjw at redhat.com>
> Date: Wed, 18 Dec 2013 11:05:54 +0100
> Subject: [PATCH] libdwfl: Introduce dwfl_module_getsym_info and dwfl_module_addrinfo.
> 
> Some arches like ppc64 use function descriptor values instead of function
> addresses causing matching of names and addresses to fail when using
> dwfl_module_getsym or dwfl_module_addrsym.
> 
> Add ebl hook to resolve any function descriptor values found in non-ET_REL
> modules.
> 
> The new function dwfl_module_getsym_info doesn't adjust the symbol value
> in any way, but returns the adjusted and/or resolved address associated
> with the symbol separately. The new function dwfl_module_addrinfo resolves
> against both the address associated with the symbol (which could be the
> function entry address) value and the adjusted st_value. So that it is
> easy to resolve and match either function descriptors and/or function
> entry addresses.
> 
> Since these new functions also return more information they replace the
> dwfl_module_getsym_elf and dwfl_module_addrsym_elf functions that never
> made it into a released elfutils version.
> 
> addr2line and readelf now use the new functions when looking up functions
> names. addr2line will now also display the section the address was found
> in when given -x.
> 
> Extra testcases were added for both addr2line and the dwflsyms testscase.
> 
> Signed-off-by: Mark Wielaard <mjw at redhat.com>
> ---
>  ChangeLog                                          |    6 +
>  NEWS                                               |    3 +
>  backends/ChangeLog                                 |    7 +
>  backends/Makefile.am                               |    2 +-
>  backends/ppc64_init.c                              |   30 ++
>  backends/ppc64_resolve_sym.c                       |   63 +++
>  libdw/ChangeLog                                    |    6 +
>  libdw/libdw.map                                    |    4 +-
>  libdwfl/ChangeLog                                  |   31 ++
>  libdwfl/derelocate.c                               |   13 +-
>  libdwfl/dwfl_module_addrname.c                     |    6 +-
>  libdwfl/dwfl_module_addrsym.c                      |  220 +++++++----
>  libdwfl/dwfl_module_getsym.c                       |   63 +++-
>  libdwfl/libdwfl.h                                  |   80 +++-
>  libdwfl/libdwflP.h                                 |   27 ++-
>  libebl/ChangeLog                                   |    9 +
>  libebl/Makefile.am                                 |    2 +-
>  libebl/ebl-hooks.h                                 |    5 +
>  .../eblresolvesym.c                                |   21 +-
>  libebl/libebl.h                                    |    6 +
>  libebl/libeblP.h                                   |    5 +
>  src/ChangeLog                                      |   12 +
>  src/addr2line.c                                    |   54 +++-
>  src/readelf.c                                      |   16 +-
>  tests/ChangeLog                                    |   22 +
>  tests/Makefile.am                                  |    7 +-
>  tests/dwflsyms.c                                   |   59 +++-
>  tests/run-addrname-test.sh                         |   35 ++
>  tests/run-dwflsyms.sh                              |  413 ++++++++++++++++++++
>  tests/testfile66.bz2                               |  Bin 0 -> 741 bytes
>  tests/testfile66.core.bz2                          |  Bin 0 -> 56448 bytes
>  tests/testfilebazdbgppc64.bz2                      |  Bin 0 -> 2366 bytes
>  tests/testfilebazdbgppc64.debug.bz2                |  Bin 0 -> 2295 bytes
>  tests/testfilebazdbgppc64_pl.bz2                   |  Bin 0 -> 2775 bytes
>  tests/testfilebazdbgppc64_plr.bz2                  |  Bin 0 -> 2399 bytes
>  tests/testfilebazdynppc64.bz2                      |  Bin 0 -> 2327 bytes
>  tests/testfilebazmdbppc64.bz2                      |  Bin 0 -> 3528 bytes
>  tests/testfilebazminppc64.bz2                      |  Bin 0 -> 3464 bytes
>  tests/testfilebazminppc64_pl.bz2                   |  Bin 0 -> 3900 bytes
>  tests/testfilebazminppc64_plr.bz2                  |  Bin 0 -> 3535 bytes
>  tests/testfilebaztabppc64.bz2                      |  Bin 0 -> 3697 bytes
>  41 files changed, 1076 insertions(+), 151 deletions(-)
>  create mode 100644 backends/ppc64_resolve_sym.c
>  copy libdwfl/dwfl_module_addrname.c => libebl/eblresolvesym.c (72%)
>  create mode 100755 tests/testfile66.bz2
>  create mode 100644 tests/testfile66.core.bz2
>  create mode 100755 tests/testfilebazdbgppc64.bz2
>  create mode 100755 tests/testfilebazdbgppc64.debug.bz2
>  create mode 100755 tests/testfilebazdbgppc64_pl.bz2
>  create mode 100755 tests/testfilebazdbgppc64_plr.bz2
>  create mode 100755 tests/testfilebazdynppc64.bz2
>  create mode 100755 tests/testfilebazmdbppc64.bz2
>  create mode 100755 tests/testfilebazminppc64.bz2
>  create mode 100755 tests/testfilebazminppc64_pl.bz2
>  create mode 100755 tests/testfilebazminppc64_plr.bz2
>  create mode 100755 tests/testfilebaztabppc64.bz2




More information about the elfutils-devel mailing list