rtems-addr2line not working on ARM?

Sebastian Huber sebastian.huber at embedded-brains.de
Sat Sep 7 14:25:57 UTC 2019


----- Am 6. Sep 2019 um 18:06 schrieb Sebastian Huber sebastian.huber at embedded-brains.de:

> ----- Am 6. Sep 2019 um 11:09 schrieb Sebastian Huber
> sebastian.huber at embedded-brains.de:
> 
>> On 06/09/2019 09:26, Sebastian Huber wrote:
>>> On 06/09/2019 09:01, Chris Johns wrote:
>>>> On 6/9/19 4:20 pm, Sebastian Huber wrote:
>>>>> Hello,
>>>>>
>>>>> I tried the rtems-addr2line on ARM and SPARC. On SPARC it seems to
>>>>> work fine,
>>>>> however, on ARM I get this:
>>>>>
>>>>> rtems-addr2line -e
>>>>> build/arm-rtems5-xilinx_zynq_a9_qemu-everything/media01.exe
>>>>> 0x0000135a
>>>>> /home/EB/sebastian_h/git-rtems-5/c/src/lib/libbsp/arm/xilinx-zynq/../../../../../../bsps/arm/shared/irq/irq-gic.c:264
>>>>>
>>>>>
>>>>>
>>>>> addr2line -e
>>>>> build/arm-rtems5-xilinx_zynq_a9_qemu-everything/media01.exe 0000135a
>>>>> /scratch/git-rtems-libbsd/build/arm-rtems5-xilinx_zynq_a9_qemu-everything/../../testsuite/include/rtems/bsd/test/default-network-init.h:179
>>>>>
>>>>>
>>>>>
>>>>> The GNU tool is right. It is also considerably faster.
>>>> I would hope it is faster and exact. It has had many years of work on it,
>>>> written in C and not a means to test a C++ framework so we can grow an
>>>> ecosystem. I have stated its purpose before. I am perplexed by the
>>>> intent of
>>>> this statement.
>>>>
>>>> If you want to compare performance I suggest you try the elftools one?
>>>> There is
>>>> one. It is not built because GNU provides one and good one.
>>>>
>>>> Also be-careful as the exec call is not as fast as Linux on all the
>>>> hosts we
>>>> support.
>>> 
>>> That the GNU tool is faster was just an observation.
>>> 
>>> Do we have a working library solution to get from an address to the
>>> source line/function? I don't have time to debug the DWARF support code
>>> at the moment.
>>> 
>>> I have a working solution using "addr2line" and rld::process::execute().
>> 
>> Thanks for the hint to the elftoolchain:
>> 
>> https://github.com/elftoolchain/elftoolchain/blob/trunk/addr2line/addr2line.c
>> 
>> To me it looks pretty complicated. It should be possible to refactor
>> this code to use it as a library, e.g. call translate() for each address
>> you need the source information.
>> 
>> I tried to debug the rld get_source() problem for more than two hours
>> and the elftoolchain code looks similar. I am not sure what to do.
> 
> Another option is to use the LLVM infrastructure:
> 
> https://github.com/llvm-mirror/llvm/blob/master/tools/llvm-symbolizer/llvm-symbolizer.cpp
> 
> From a first glance, this looks like the way to go.

Attached is a patch which uses the LLVM library to get an addr2line functionality. The code to resolve an address is very easy (item.data is the address):

    auto res_or_err = symbolizer_.symbolizeCode(elf_file_, item.data);

    if (res_or_err) {
      auto info = res_or_err.get();
      std::string fn = info.FunctionName;
      std::string str;

      if (fn != "<invalid>") {
        str += fn;
        str += " at ";
      }

      str += llvm::sys::path::filename(info.FileName);
      str += ":";
      str += std::to_string(info.Line);

LLVM has also support for command line arguments, file handling, etc.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-record-Use-LLVM-to-link-to-the-source-code.patch
Type: text/x-patch
Size: 11469 bytes
Desc: not available
URL: <http://lists.rtems.org/pipermail/devel/attachments/20190907/94b54b75/attachment.bin>


More information about the devel mailing list