tech-toolchain archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Help needed with binutils solving [PR 54159]



Hello Martin,

Thank you! But it seemed that I was taking it from the wrong side
(reading targets.c with mentions of the macro BFD_SEND and this seems
obsolete) and that following in the source the functions with the
suffixes (bed->s->swap_symbol_in is calling "*swap_symbol_in" in
the target file) was sufficient.

It ends in elf32-arm.c:elf32_arm_swap_symbol_in calling
bfd_elf_sym_name() with incorrect arguments.

It calls to resolv with elf_symtab_hdr(abfd) that
returns .symtab while in case of dshared it should use dynstrtab_hdr
(to be verified).

I will continue to look tomorrow.

Best regards,

T. Laronde

On Wed, Aug 14, 2019 at 01:14:22PM +0200, Martin Husemann wrote:
> On Wed, Aug 14, 2019 at 12:45:15PM +0200, tlaronde%polynum.com@localhost wrote:
> > The bug reported via PR 54159 with spurious warnings from GNU lib about
> > strings offsets past the size of the .strtab section are in fact due
> > to the fact that in the case of dynamic linking, the code takes the
> > .dynsym symbol table (and not the .symtab) and tries to match the offset
> > against .strtab while they are relative to .dynstr.
> > 
> > The warnings come from bfd_link_add_symbols(). But this is a generic
> > name and a backend version is called through the BFD xvec vector.
> 
> I just did:
> 
> gdb ld
> break bfd_close
> run ....
> 
> and get to this:
> 
> Breakpoint 2, bfd_close (abfd=0x76a6c000)
>     at /work/src/external/gpl3/binutils/lib/libbfd/../../dist/bfd/opncls.c:729
> 729     /work/src/external/gpl3/binutils/lib/libbfd/../../dist/bfd/opncls.c: No such file or directory.
> #0  bfd_close (abfd=0x76a6c000)
>     at /work/src/external/gpl3/binutils/lib/libbfd/../../dist/bfd/opncls.c:729
> #1  0x01438d04 in main (argc=<optimized out>, argv=<optimized out>)
>     at /work/src/external/gpl3/binutils/usr.bin/ld/../../dist/ld/ldmain.c:489
> (gdb) p *abfd
> $1 = {filename = 0x76e4a3f8 "a.out", xvec = 0x76e3ac24 <arm_elf32_be_vec>, 
>   iostream = 0x76d10e60, iovec = 0x76e38e88, lru_prev = 0x76a6c480, 
>   lru_next = 0x76a6ca80, where = 3038, mtime = 0, id = 0, format = bfd_object, 
>   direction = write_direction, flags = 386, cacheable = 1, 
> ...
> (gdb) p *abfd->xvec
> $2 = {name = 0x76e07224 "elf32-bigarm", flavour = bfd_target_elf_flavour, 
>   byteorder = BFD_ENDIAN_BIG, header_byteorder = BFD_ENDIAN_BIG, 
>   object_flags = 967167, section_flags = 63021375, 
>   symbol_leading_char = 0 '\000', ar_pad_char = 47 '/', 
>   ar_max_namelen = 15 '\017', match_priority = 1 '\001', 
>   bfd_getx64 = 0x76dfc530 <bfd_getb64>, 
>   bfd_getx_signed_64 = 0x76dfc62c <bfd_getb_signed_64>, 
>   bfd_putx64 = 0x76dfc7b0 <bfd_putb64>, bfd_getx32 = 0x76dfc508 <bfd_getb32>, 
>   bfd_getx_signed_32 = 0x76dfc51c <bfd_getb_signed_32>, 
>   bfd_putx32 = 0x76dfc728 <bfd_putb32>, bfd_getx16 = 0x76dfc48c <bfd_getb16>, 
>   bfd_getx_signed_16 = 0x76dfc4a4 <bfd_getb_signed_16>, 
>   bfd_putx16 = 0x76dfc4b8 <bfd_putb16>, 
>   bfd_h_getx64 = 0x76dfc530 <bfd_getb64>, 
>   bfd_h_getx_signed_64 = 0x76dfc62c <bfd_getb_signed_64>, 
>   bfd_h_putx64 = 0x76dfc7b0 <bfd_putb64>, 
>   bfd_h_getx32 = 0x76dfc508 <bfd_getb32>, 
>   bfd_h_getx_signed_32 = 0x76dfc51c <bfd_getb_signed_32>, 
>   bfd_h_putx32 = 0x76dfc728 <bfd_putb32>, 
>   bfd_h_getx16 = 0x76dfc48c <bfd_getb16>, 
>   bfd_h_getx_signed_16 = 0x76dfc4a4 <bfd_getb_signed_16>, 
>   bfd_h_putx16 = 0x76dfc4b8 <bfd_putb16>, _bfd_check_format = {
>     0x76dfc240 <_bfd_dummy_target>, 0x76dce8cc <bfd_elf32_object_p>, 
>     0x76df1d2c <bfd_generic_archive_p>, 0x76dcf734 <bfd_elf32_core_file_p>}, 
>   _bfd_set_format = {0x76dfc0e8 <_bfd_bool_bfd_false_error>, 
>     0x76dd3460 <elf32_arm_mkobject>, 0x76df13f4 <_bfd_generic_mkarchive>, 
>     0x76dba99c <bfd_elf_mkcorefile>}, _bfd_write_contents = {
>     0x76dfc0e8 <_bfd_bool_bfd_false_error>, 
>     0x76dc2760 <_bfd_elf_write_object_contents>, 
>     0x76df3368 <_bfd_write_archive_contents>, 
>     0x76dc2b5c <_bfd_elf_write_corefile_contents>}, 
>   _close_and_cleanup = 0x76dc7284 <_bfd_elf_close_and_cleanup>, 
>   _bfd_free_cached_info = 0x76df8fcc <_bfd_free_cached_info>, 
>   _new_section_hook = 0x76dd3414 <elf32_arm_new_section_hook>, 
>   _bfd_get_section_contents = 0x76dfc948 <_bfd_generic_get_section_contents>, 
>   _bfd_get_section_contents_in_window = 0x76dfcac4 <_bfd_generic_get_section_contents_in_window>, 
>   _bfd_copy_private_bfd_data = 0x76ddb1e0 <elf32_arm_copy_private_bfd_data>, 
>   _bfd_merge_private_bfd_data = 0x76dd2198 <elf32_arm_merge_private_bfd_data>, 
>   _bfd_init_private_section_data = 0x76dc2c30 <_bfd_elf_init_private_section_data>, 
>   _bfd_copy_private_section_data = 0x76dc2ddc <_bfd_elf_copy_private_section_data>, 
>   _bfd_copy_private_symbol_data = 0x76dc4c28 <_bfd_elf_copy_private_symbol_data>, 
>   _bfd_copy_private_header_data = 0x76dc2fc8 <_bfd_elf_copy_private_header_data>, _bfd_set_private_flags = 0x76dd43a4 <elf32_arm_set_private_flags>, 
> ...
> 
> and especially:
> 
> (gdb) p *abfd->xvec->_bfd_link_add_symbols
> $3 = {bfd_boolean (bfd *, 
>     struct bfd_link_info *)} 0x76dac764 <bfd_elf_link_add_symbols>
> (gdb) list bfd_elf_link_add_symbols
> 5718    /work/src/external/gpl3/binutils/lib/libbfd/../../dist/bfd/elflink.c: No such file or directory.
> 
> 
> (and with a source tree mounted on the proper directory it would have been
> even better, sorry...)
> 
> Martin

-- 
        Thierry Laronde <tlaronde +AT+ polynum +dot+ com>
                     http://www.kergis.com/
                       http://www.sbfa.fr/
Key fingerprint = 0FF7 E906 FBAF FE95 FD89  250D 52B1 AE95 6006 F40C


Home | Main Index | Thread Index | Old Index