public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Ian Lance Taylor <ian@zembu.com>
To: nickc@cygnus.com
Cc: binutils@sourceware.cygnus.com
Subject: Re: Where to put per-target global BFD data ?
Date: Thu, 01 Jul 1999 00:00:00 -0000	[thread overview]
Message-ID: <19990618184846.22675.qmail@daffy.airs.com> (raw)
In-Reply-To: <199906180941.KAA12938@pathia.cygnus.co.uk>

   Date: Fri, 18 Jun 1999 10:41:18 +0100
   From: Nick Clifton <nickc@cygnus.com>

     I have come across a problem with storing target specific global
     data in BFD.  Currently targets like the ARM ports create an
     extended version of the link hash table, override the default 
     link_hash_table_create function with their own version, and then
     store their data in the new fields now available.

     This fails however, when the output format is not the same as the
     input format.  For example linking together a coff-arm object file
     with the command line:

	  ld -oformat srec foo.o

     will fail with a segmentation fault because the hash in the
     link_info structure gets created based on the output format (srec)
     not the input format (coff-arm).  The srec format does not create an
     extended structure on the end of the hash table, and so the coff-arm
     routines that get called later, and which assume that the coff-arm
     version of link_hash_table_create has been called, try to use data
     which is not there. 

     I am not sure how this can be fixed.  I think using the hash table
     may not be the best way to store global information, because of this
     problem, and that another solution needs to be found.

As you have seen, this is a general problem.  There is no way to
handle target specific information during a link to a different object
file format.  Right now, there are quite a few links which can not be
done directly to the srecord format.

If the ARM code gets a segmentation fault, that means that it is not
protecting itself correctly.  You should compare info->hash->creator
with abfd->xvec, and, if they are different, you should not assume
that the linker hash table contains ARM specific information.  You can
see quite a few examples of this in the various BFD linker
implementations.

Solving the problem in the general case is hard.  In principle, BFD
can be used to link different object file formats together.  If those
object file formats expect different global information to be stored,
then it is hard to know whether that information will be initialized
or finalized correctly.  The global information that is stored during
a link is often tied to the emulation, and if you are running a
different emulation due to a linker -m option, the wrong thing will
happen.

We might be able to fix one aspect of the problem by storing the
global information in a pointer off of the bfd_link_info structure,
and passing a pointer to that structure to the hash_table_create
function.  We would also have to create the information as it was
needed, somehow.  We could perhaps store a list of information there,
with markers to indicate which target each entry on the list was for.
Then you would have access to the global information you needed.
However, we would still need to tie the emulation code in somehow.

These are problems I unfortunately did not fully consider when I
integrated the ELF dynamic linking support.

In practice, I have simply told people that for several cases -oformat
srec unfortunately does not work, and that they must use objcopy
instead.

Ian

  reply	other threads:[~1999-07-01  0:00 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1999-07-01  0:00 Nick Clifton
1999-07-01  0:00 ` Ian Lance Taylor [this message]
1999-07-01  0:00 ` Richard Henderson
1999-07-01  0:00   ` Jeffrey A Law
1999-07-01  0:00     ` Ian Lance Taylor

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=19990618184846.22675.qmail@daffy.airs.com \
    --to=ian@zembu.com \
    --cc=binutils@sourceware.cygnus.com \
    --cc=nickc@cygnus.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).