* elf_link_hash_entry vs generic_link_hash_entry
[not found] <si66bh2zdl.fsf@daffy.airs.com>
@ 2001-08-22 0:44 ` Nick Clifton
2001-08-22 1:06 ` Thiemo Seufer
2001-08-23 9:22 ` H . J . Lu
0 siblings, 2 replies; 12+ messages in thread
From: Nick Clifton @ 2001-08-22 0:44 UTC (permalink / raw)
To: binutils; +Cc: Ian Lance Taylor
Hi Guys,
Ian Taylor has pointed out that my recent patch to elfxx-target.h
has actually broken several elf based ports. (Specifically: pj,
m88k, m68hc11, m68hc12, i960, d30v, arc, gen). The problem is that
these ports uses the generic linker code to perform section
relocation rather than having their own specific code. This breaks
if the elf hash table structure (elf_link_hash_entry) is used
instead of the generic_link_hash_entry structure, since the two
structures are not compatable. The reason that my patch changed
elfxx-target.h so that all elf backends would use elf_link_hash_entry
is that several other parts of the elf linker rely upon using other
fields which are only found in that structure.
As I see there are three ways that we can fix this:
1. Require that all ELF backends define their own section
relocation function and final link function. Make it a #error
if they do not. Fix all the ports that currently do not do
this. This is Ian's recommended solution.
2. Add the fields from generic_link_hash_entry to
elf_link_hash_entry so that the generic functions can be used
with the elf structure. This is my preferred solution, but as
Ian points out, this will increase the size of the hash table
and that is already a significant memory hog.
3. Go back to the old situation where elf ports that do not provide
their own relocation backends use the generic linker hash table
entry structure, but add code to the other elf routines to
detect this and fail before they try to access fields in the
hash structure that are not there.
Any comments ?
Cheers
Nick
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: elf_link_hash_entry vs generic_link_hash_entry
2001-08-22 0:44 ` elf_link_hash_entry vs generic_link_hash_entry Nick Clifton
@ 2001-08-22 1:06 ` Thiemo Seufer
2001-08-22 7:02 ` Ian Lance Taylor
2001-08-23 9:22 ` H . J . Lu
1 sibling, 1 reply; 12+ messages in thread
From: Thiemo Seufer @ 2001-08-22 1:06 UTC (permalink / raw)
To: binutils
Nick Clifton wrote:
> Hi Guys,
>
> Ian Taylor has pointed out that my recent patch to elfxx-target.h
> has actually broken several elf based ports. (Specifically: pj,
> m88k, m68hc11, m68hc12, i960, d30v, arc, gen). The problem is that
> these ports uses the generic linker code to perform section
> relocation rather than having their own specific code. This breaks
> if the elf hash table structure (elf_link_hash_entry) is used
> instead of the generic_link_hash_entry structure, since the two
> structures are not compatable. The reason that my patch changed
> elfxx-target.h so that all elf backends would use elf_link_hash_entry
> is that several other parts of the elf linker rely upon using other
> fields which are only found in that structure.
>
> As I see there are three ways that we can fix this:
>
> 1. Require that all ELF backends define their own section
> relocation function and final link function. Make it a #error
> if they do not. Fix all the ports that currently do not do
> this. This is Ian's recommended solution.
What about introducing something like generic_elf_final_link_relocate()
and generic_elf_final_link() instead of code duplication?
Thiemo
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: elf_link_hash_entry vs generic_link_hash_entry
2001-08-22 1:06 ` Thiemo Seufer
@ 2001-08-22 7:02 ` Ian Lance Taylor
0 siblings, 0 replies; 12+ messages in thread
From: Ian Lance Taylor @ 2001-08-22 7:02 UTC (permalink / raw)
To: Thiemo Seufer; +Cc: binutils
Thiemo Seufer <ica2_ts@csv.ica.uni-stuttgart.de> writes:
> Nick Clifton wrote:
> > Hi Guys,
> >
> > Ian Taylor has pointed out that my recent patch to elfxx-target.h
> > has actually broken several elf based ports. (Specifically: pj,
> > m88k, m68hc11, m68hc12, i960, d30v, arc, gen). The problem is that
> > these ports uses the generic linker code to perform section
> > relocation rather than having their own specific code. This breaks
> > if the elf hash table structure (elf_link_hash_entry) is used
> > instead of the generic_link_hash_entry structure, since the two
> > structures are not compatable. The reason that my patch changed
> > elfxx-target.h so that all elf backends would use elf_link_hash_entry
> > is that several other parts of the elf linker rely upon using other
> > fields which are only found in that structure.
> >
> > As I see there are three ways that we can fix this:
> >
> > 1. Require that all ELF backends define their own section
> > relocation function and final link function. Make it a #error
> > if they do not. Fix all the ports that currently do not do
> > this. This is Ian's recommended solution.
>
> What about introducing something like generic_elf_final_link_relocate()
> and generic_elf_final_link() instead of code duplication?
Each ELF backend has different relocation handling, so a simple
implementation of this would not work.
It should, however, be possible to design a relocation structure which
captured most of the essential elements of ELF relocation types--GOT
creation, etc.--and then use more generic code to handle it. I think
that this project should not be confused with what Nick is talking
about.
BTW, although I think that Nick's choice 1 is reasonable, I would
actually recommend his choice 3: fix the broken code which assumes
that it knows what type of hash table it is dealing with. That code
will also break linking directly to S-records. Admittedly linking
directly to S-records probably doesn't work, but as far as I know
making it work has not been abandoned as a goal. If it has, I believe
that considerable simplifications are possible.
Ian
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: elf_link_hash_entry vs generic_link_hash_entry
2001-08-22 0:44 ` elf_link_hash_entry vs generic_link_hash_entry Nick Clifton
2001-08-22 1:06 ` Thiemo Seufer
@ 2001-08-23 9:22 ` H . J . Lu
2001-08-23 11:36 ` H . J . Lu
1 sibling, 1 reply; 12+ messages in thread
From: H . J . Lu @ 2001-08-23 9:22 UTC (permalink / raw)
To: Nick Clifton; +Cc: binutils, Ian Lance Taylor
On Wed, Aug 22, 2001 at 08:41:11AM +0100, Nick Clifton wrote:
>
> 3. Go back to the old situation where elf ports that do not provide
> their own relocation backends use the generic linker hash table
> entry structure, but add code to the other elf routines to
> detect this and fail before they try to access fields in the
> hash structure that are not there.
>
I'd like this one. How about we turn elf_hash_table into something
specific to each backend? For those targets which don't use
_bfd_elf_link_hash_table_create, it will return NULL or a fatal
bfd error.
H.J.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: elf_link_hash_entry vs generic_link_hash_entry
2001-08-23 9:22 ` H . J . Lu
@ 2001-08-23 11:36 ` H . J . Lu
2001-08-23 12:10 ` H . J . Lu
` (2 more replies)
0 siblings, 3 replies; 12+ messages in thread
From: H . J . Lu @ 2001-08-23 11:36 UTC (permalink / raw)
To: Nick Clifton; +Cc: binutils, Ian Lance Taylor
On Thu, Aug 23, 2001 at 09:21:40AM -0700, H . J . Lu wrote:
> On Wed, Aug 22, 2001 at 08:41:11AM +0100, Nick Clifton wrote:
> >
> > 3. Go back to the old situation where elf ports that do not provide
> > their own relocation backends use the generic linker hash table
> > entry structure, but add code to the other elf routines to
> > detect this and fail before they try to access fields in the
> > hash structure that are not there.
> >
>
> I'd like this one. How about we turn elf_hash_table into something
> specific to each backend? For those targets which don't use
> _bfd_elf_link_hash_table_create, it will return NULL or a fatal
> bfd error.
>
>
Here is a patch. Ian, as you mentioned, linking directly to S-records
no longer works. I got
/export/build/gnu/binutils/build-full-i686-linux/ld/ld-new -o tmpdir/sr2.sr -T text 0x1000 --oformat srec tmpdir/sr1.o tmpdir/sr2.o
child killed: segmentation violation
FAIL: S-records
/export/build/gnu/binutils/build-full-i686-linux/ld/ld-new -o tmpdir/sr2.sr -T text 0x1000 --oformat srec tmpdir/sr3.o
child killed: segmentation violation
FAIL: S-records with constructors
How should we fix it?
Thanks.
H.J.
----
2001-08-23 H.J. Lu <hjl@gnu.org>
* bfdlink.h (bfd_link_hash_table_type): New. The linker hash
table type, bfd_link_generic_hash_table and
bfd_link_elf_hash_table.
(bfd_link_hash_table): Add a new field, type, for the linker
hash table type.
2001-08-23 H.J. Lu <hjl@gnu.org>
* elf-bfd.h (elf_hash_table): Return NULL if the linker hash
table is not an ELF linker hash table.
* elf.c (_bfd_elf_link_hash_table_init): Set the linker hash
table type to bfd_link_elf_hash_table.
* elfxx-target.h (bfd_elfNN_bfd_link_hash_table_create): Revert
the last change.
* linker.c (_bfd_link_hash_table_init): Set the linker hash
table type to bfd_link_generic_hash_table.
Index: bfd/elf-bfd.h
===================================================================
RCS file: /work/cvs/gnu/binutils/bfd/elf-bfd.h,v
retrieving revision 1.17
diff -u -p -r1.17 elf-bfd.h
--- bfd/elf-bfd.h 2001/08/23 17:02:19 1.17
+++ bfd/elf-bfd.h 2001/08/23 18:25:39
@@ -280,7 +280,9 @@ struct elf_link_hash_table
/* Get the ELF linker hash table from a link_info structure. */
-#define elf_hash_table(p) ((struct elf_link_hash_table *) ((p)->hash))
+#define elf_hash_table(p) \
+ ((struct elf_link_hash_table *) \
+ (((p)->hash->type == bfd_link_elf_hash_table) ? (p)->hash : NULL))
\f
/* Constant information held for an ELF backend. */
Index: bfd/elf.c
===================================================================
RCS file: /work/cvs/gnu/binutils/bfd/elf.c,v
retrieving revision 1.62
diff -u -p -r1.62 elf.c
--- bfd/elf.c 2001/08/23 17:02:20 1.62
+++ bfd/elf.c 2001/08/23 18:25:40
@@ -1047,6 +1047,7 @@ _bfd_elf_link_hash_table_init (table, ab
struct bfd_hash_table *,
const char *));
{
+ boolean ret;
table->dynamic_sections_created = false;
table->dynobj = NULL;
/* The first dynamic symbol is a dummy. */
@@ -1060,7 +1061,9 @@ _bfd_elf_link_hash_table_init (table, ab
table->stab_info = NULL;
table->merge_info = NULL;
table->dynlocal = NULL;
- return _bfd_link_hash_table_init (&table->root, abfd, newfunc);
+ ret = _bfd_link_hash_table_init (&table->root, abfd, newfunc);
+ table->root.type = bfd_link_elf_hash_table;
+ return ret;
}
/* Create an ELF linker hash table. */
Index: bfd/elfxx-target.h
===================================================================
RCS file: /work/cvs/gnu/binutils/bfd/elfxx-target.h,v
retrieving revision 1.1.1.21
diff -u -p -r1.1.1.21 elfxx-target.h
--- bfd/elfxx-target.h 2001/08/23 16:39:09 1.1.1.21
+++ bfd/elfxx-target.h 2001/08/23 18:25:40
@@ -162,11 +162,16 @@ Foundation, Inc., 59 Temple Place - Suit
_bfd_elf_canonicalize_dynamic_reloc
#endif
+#ifdef elf_backend_relocate_section
#ifndef bfd_elfNN_bfd_link_hash_table_create
#define bfd_elfNN_bfd_link_hash_table_create _bfd_elf_link_hash_table_create
#endif
-#ifndef elf_backend_relocate_section
+#else /* ! defined (elf_backend_relocate_section) */
/* If no backend relocate_section routine, use the generic linker. */
+#ifndef bfd_elfNN_bfd_link_hash_table_create
+#define bfd_elfNN_bfd_link_hash_table_create \
+ _bfd_generic_link_hash_table_create
+#endif
#ifndef bfd_elfNN_bfd_link_add_symbols
#define bfd_elfNN_bfd_link_add_symbols _bfd_generic_link_add_symbols
#endif
Index: bfd/linker.c
===================================================================
RCS file: /work/cvs/gnu/binutils/bfd/linker.c,v
retrieving revision 1.10
diff -u -p -r1.10 linker.c
--- bfd/linker.c 2001/08/17 17:56:20 1.10
+++ bfd/linker.c 2001/08/23 18:25:40
@@ -483,6 +483,7 @@ _bfd_link_hash_table_init (table, abfd,
table->creator = abfd->xvec;
table->undefs = NULL;
table->undefs_tail = NULL;
+ table->type = bfd_link_generic_hash_table;
return bfd_hash_table_init (&table->table, newfunc);
}
Index: include/bfdlink.h
===================================================================
RCS file: /work/cvs/gnu/binutils/include/bfdlink.h,v
retrieving revision 1.15
diff -u -p -r1.15 bfdlink.h
--- include/bfdlink.h 2001/08/23 17:02:23 1.15
+++ include/bfdlink.h 2001/08/23 18:25:42
@@ -42,6 +42,12 @@ enum bfd_link_discard
discard_all /* Discard all locals. */
};
\f
+enum bfd_link_hash_table_type
+{
+ bfd_link_generic_hash_table,
+ bfd_link_elf_hash_table
+};
+
/* These are the possible types of an entry in the BFD link hash
table. */
@@ -146,6 +152,8 @@ struct bfd_link_hash_table
struct bfd_link_hash_entry *undefs;
/* Entries are added to the tail of the undefs list. */
struct bfd_link_hash_entry *undefs_tail;
+ /* The type of the ink hash table. */
+ enum bfd_link_hash_table_type type;
};
/* Look up an entry in a link hash table. If FOLLOW is true, this
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: elf_link_hash_entry vs generic_link_hash_entry
2001-08-23 11:36 ` H . J . Lu
@ 2001-08-23 12:10 ` H . J . Lu
2001-08-24 9:35 ` Nick Clifton
2001-08-24 9:18 ` Nick Clifton
2001-08-28 15:53 ` Richard Henderson
2 siblings, 1 reply; 12+ messages in thread
From: H . J . Lu @ 2001-08-23 12:10 UTC (permalink / raw)
To: Nick Clifton; +Cc: binutils, Ian Lance Taylor
On Thu, Aug 23, 2001 at 11:36:56AM -0700, H . J . Lu wrote:
> On Thu, Aug 23, 2001 at 09:21:40AM -0700, H . J . Lu wrote:
> > On Wed, Aug 22, 2001 at 08:41:11AM +0100, Nick Clifton wrote:
> > >
> > > 3. Go back to the old situation where elf ports that do not provide
> > > their own relocation backends use the generic linker hash table
> > > entry structure, but add code to the other elf routines to
> > > detect this and fail before they try to access fields in the
> > > hash structure that are not there.
> > >
> >
> > I'd like this one. How about we turn elf_hash_table into something
> > specific to each backend? For those targets which don't use
> > _bfd_elf_link_hash_table_create, it will return NULL or a fatal
> > bfd error.
> >
> >
>
> Here is a patch. Ian, as you mentioned, linking directly to S-records
> no longer works. I got
>
> /export/build/gnu/binutils/build-full-i686-linux/ld/ld-new -o tmpdir/sr2.sr -T text 0x1000 --oformat srec tmpdir/sr1.o tmpdir/sr2.o
> child killed: segmentation violation
> FAIL: S-records
> /export/build/gnu/binutils/build-full-i686-linux/ld/ld-new -o tmpdir/sr2.sr -T text 0x1000 --oformat srec tmpdir/sr3.o
> child killed: segmentation violation
> FAIL: S-records with constructors
>
> How should we fix it?
>
How about this patch?
H.J.
----
2001-08-23 H.J. Lu <hjl@gnu.org>
* elflink.h (elf_link_add_object_symbols): Don't merge section
nor add the file to the loaded list if the linker hash table
is not an an ELF linker hash table.
Index: elflink.h
===================================================================
RCS file: /work/cvs/gnu/binutils/bfd/elflink.h,v
retrieving revision 1.70
diff -u -p -r1.70 elflink.h
--- elflink.h 2001/08/23 17:02:20 1.70
+++ elflink.h 2001/08/23 19:07:05
@@ -1068,7 +1068,10 @@ elf_link_add_object_symbols (abfd, info)
Elf_External_Sym *esymend;
struct elf_backend_data *bed;
boolean dt_needed;
+ struct elf_link_hash_table *hash_table;
+ hash_table = elf_hash_table (info);
+
bed = get_elf_backend_data (abfd);
add_symbol_hook = bed->elf_add_symbol_hook;
collect = bed->collect;
@@ -2330,33 +2333,32 @@ elf_link_add_object_symbols (abfd, info)
}
}
- if (! info->relocateable && ! dynamic)
+ if (hash_table && ! info->relocateable && ! dynamic)
{
asection *s;
for (s = abfd->sections; s != NULL; s = s->next)
if ((s->flags & SEC_MERGE)
- && ! _bfd_merge_section (abfd,
- &elf_hash_table (info)->merge_info,
- s, &elf_section_data (s)->merge_info))
+ && ! _bfd_merge_section (abfd, &hash_table->merge_info, s,
+ &elf_section_data (s)->merge_info))
goto error_return;
}
+
+ if (hash_table)
+ {
+ /* We add this to the loaded list. */
+ struct elf_link_loaded_list *n, **pn;
- {
- /* We add this to the loaded list. */
- struct elf_link_loaded_list *n, **pn;
-
- n = ((struct elf_link_loaded_list *)
- bfd_alloc (abfd, sizeof (struct elf_link_loaded_list)));
- if (n == NULL)
- goto error_return;
- n->next = NULL;
- n->abfd = abfd;
- for (pn = &elf_hash_table (info)->loaded; *pn != NULL;
- pn = &(*pn)->next)
- ;
- *pn = n;
- }
+ n = ((struct elf_link_loaded_list *)
+ bfd_alloc (abfd, sizeof (struct elf_link_loaded_list)));
+ if (n == NULL)
+ goto error_return;
+ n->next = NULL;
+ n->abfd = abfd;
+ for (pn = &hash_table->loaded; *pn != NULL; pn = &(*pn)->next)
+ ;
+ *pn = n;
+ }
return true;
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: elf_link_hash_entry vs generic_link_hash_entry
2001-08-23 11:36 ` H . J . Lu
2001-08-23 12:10 ` H . J . Lu
@ 2001-08-24 9:18 ` Nick Clifton
2001-08-24 9:22 ` H . J . Lu
2001-08-28 15:53 ` Richard Henderson
2 siblings, 1 reply; 12+ messages in thread
From: Nick Clifton @ 2001-08-24 9:18 UTC (permalink / raw)
To: H . J . Lu; +Cc: binutils, Ian Lance Taylor
Hi H.J.
> 2001-08-23 H.J. Lu <hjl@gnu.org>
>
> * bfdlink.h (bfd_link_hash_table_type): New. The linker hash
> table type, bfd_link_generic_hash_table and
> bfd_link_elf_hash_table.
> (bfd_link_hash_table): Add a new field, type, for the linker
> hash table type.
>
> 2001-08-23 H.J. Lu <hjl@gnu.org>
>
> * elf-bfd.h (elf_hash_table): Return NULL if the linker hash
> table is not an ELF linker hash table.
>
> * elf.c (_bfd_elf_link_hash_table_init): Set the linker hash
> table type to bfd_link_elf_hash_table.
>
> * elfxx-target.h (bfd_elfNN_bfd_link_hash_table_create): Revert
> the last change.
>
> * linker.c (_bfd_link_hash_table_init): Set the linker hash
> table type to bfd_link_generic_hash_table.
Approved and applied (since I was checking it at the time).
Cheers
Nick
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: elf_link_hash_entry vs generic_link_hash_entry
2001-08-24 9:18 ` Nick Clifton
@ 2001-08-24 9:22 ` H . J . Lu
0 siblings, 0 replies; 12+ messages in thread
From: H . J . Lu @ 2001-08-24 9:22 UTC (permalink / raw)
To: Nick Clifton; +Cc: binutils, Ian Lance Taylor
On Fri, Aug 24, 2001 at 05:15:10PM +0100, Nick Clifton wrote:
> Hi H.J.
>
> > 2001-08-23 H.J. Lu <hjl@gnu.org>
> >
> > * bfdlink.h (bfd_link_hash_table_type): New. The linker hash
> > table type, bfd_link_generic_hash_table and
> > bfd_link_elf_hash_table.
> > (bfd_link_hash_table): Add a new field, type, for the linker
> > hash table type.
> >
> > 2001-08-23 H.J. Lu <hjl@gnu.org>
> >
> > * elf-bfd.h (elf_hash_table): Return NULL if the linker hash
> > table is not an ELF linker hash table.
> >
> > * elf.c (_bfd_elf_link_hash_table_init): Set the linker hash
> > table type to bfd_link_elf_hash_table.
> >
> > * elfxx-target.h (bfd_elfNN_bfd_link_hash_table_create): Revert
> > the last change.
> >
> > * linker.c (_bfd_link_hash_table_init): Set the linker hash
> > table type to bfd_link_generic_hash_table.
>
> Approved and applied (since I was checking it at the time).
Thanks. But I didn't see them in CVS :-).
H.J.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: elf_link_hash_entry vs generic_link_hash_entry
2001-08-23 12:10 ` H . J . Lu
@ 2001-08-24 9:35 ` Nick Clifton
2001-08-24 9:54 ` H . J . Lu
2001-08-24 10:02 ` H . J . Lu
0 siblings, 2 replies; 12+ messages in thread
From: Nick Clifton @ 2001-08-24 9:35 UTC (permalink / raw)
To: H . J . Lu; +Cc: binutils, Ian Lance Taylor
Hi H.J.
> How about this patch?
>
> H.J.
> ----
> 2001-08-23 H.J. Lu <hjl@gnu.org>
>
> * elflink.h (elf_link_add_object_symbols): Don't merge section
> nor add the file to the loaded list if the linker hash table
> is not an an ELF linker hash table.
This patch does not appear to be based against the current binutils
sources. (I guess it was made against your own source tree ?)
Instead I created a modified version of your patch.
I had to make one change though - I reverted the definition of
elf_hash_table() back to its original version, since it cannot be
allowed to return NULL. (It is used in too many places as the first
argument to elf_link_hash_lookup). Instead I created a new macro
called 'is_elf_hash_table' and I added code to check it in
elf_link_add_object_symbols(), like this.
Cheers
Nick
2001-08-24 Nick Clifton <nickc@cambridge.redhat.com>
* elf-bfd.h (elf_hash_table): Revert definition.
(is_elf_hash_table): New macro.
* elflink.h (elf_link_add_object_symbols): Test
is_elf_hash_table before accessing ELF only fields in hash
structure.
(elf_link_create_dynamic_sections): Fail if not using an ELF
hash structure.
(elf_add_dynamic_entry): Fail if not using an ELF hash
structure.
(elf_link_record_local_dynamic_symbol): Fail if not using an
ELF hash structure.
(size_dynamic_sections): Fail if not using an ELF hash
structure.
(elf_adjust_dynamic_symbol): Fail if not using an ELF
hash structure.
(elf_bfd_final_link): Fail if not using an ELF hash
structure.
Index: elflink.h
===================================================================
RCS file: /cvs/src/src/bfd/elflink.h,v
retrieving revision 1.102
diff -p -r1.102 elflink.h
*** elflink.h 2001/08/24 11:17:28 1.102
--- elflink.h 2001/08/24 16:28:30
*************** elf_link_add_object_symbols (abfd, info)
*** 916,922 ****
--- 916,925 ----
Elf_External_Sym *esymend;
struct elf_backend_data *bed;
boolean dt_needed;
+ struct elf_link_hash_table * hash_table;
+ hash_table = elf_hash_table (info);
+
bed = get_elf_backend_data (abfd);
add_symbol_hook = bed->elf_add_symbol_hook;
collect = bed->collect;
*************** elf_link_add_object_symbols (abfd, info)
*** 970,976 ****
{
struct elf_link_hash_entry *h;
! h = elf_link_hash_lookup (elf_hash_table (info), name,
false, false, true);
/* FIXME: What about bfd_link_hash_common? */
--- 973,979 ----
{
struct elf_link_hash_entry *h;
! h = elf_link_hash_lookup (hash_table, name,
false, false, true);
/* FIXME: What about bfd_link_hash_common? */
*************** elf_link_add_object_symbols (abfd, info)
*** 1085,1097 ****
format. FIXME: If there are no input BFD's of the same
format as the output, we can't make a shared library. */
if (info->shared
! && ! elf_hash_table (info)->dynamic_sections_created
&& abfd->xvec == info->hash->creator)
{
if (! elf_link_create_dynamic_sections (abfd, info))
goto error_return;
}
}
else
{
asection *s;
--- 1088,1103 ----
format. FIXME: If there are no input BFD's of the same
format as the output, we can't make a shared library. */
if (info->shared
! && is_elf_hash_table (info)
! && ! hash_table->dynamic_sections_created
&& abfd->xvec == info->hash->creator)
{
if (! elf_link_create_dynamic_sections (abfd, info))
goto error_return;
}
}
+ else if (! is_elf_hash_table (info))
+ goto error_return;
else
{
asection *s;
*************** elf_link_add_object_symbols (abfd, info)
*** 1194,1200 ****
n->name = anm;
n->by = abfd;
n->next = NULL;
! for (pn = &elf_hash_table (info)->needed;
*pn != NULL;
pn = &(*pn)->next)
;
--- 1200,1206 ----
n->name = anm;
n->by = abfd;
n->next = NULL;
! for (pn = & hash_table->needed;
*pn != NULL;
pn = &(*pn)->next)
;
*************** elf_link_add_object_symbols (abfd, info)
*** 1209,1216 ****
to clear runpath. Do _NOT_ bfd_release, as that
frees all more recently bfd_alloc'd blocks as
well. */
! if (rpath && elf_hash_table (info)->runpath)
! elf_hash_table (info)->runpath = NULL;
n = ((struct bfd_link_needed_list *)
bfd_alloc (abfd, sizeof (struct bfd_link_needed_list)));
--- 1215,1222 ----
to clear runpath. Do _NOT_ bfd_release, as that
frees all more recently bfd_alloc'd blocks as
well. */
! if (rpath && hash_table->runpath)
! hash_table->runpath = NULL;
n = ((struct bfd_link_needed_list *)
bfd_alloc (abfd, sizeof (struct bfd_link_needed_list)));
*************** elf_link_add_object_symbols (abfd, info)
*** 1225,1231 ****
n->name = anm;
n->by = abfd;
n->next = NULL;
! for (pn = &elf_hash_table (info)->runpath;
*pn != NULL;
pn = &(*pn)->next)
;
--- 1231,1237 ----
n->name = anm;
n->by = abfd;
n->next = NULL;
! for (pn = & hash_table->runpath;
*pn != NULL;
pn = &(*pn)->next)
;
*************** elf_link_add_object_symbols (abfd, info)
*** 1252,1258 ****
n->name = anm;
n->by = abfd;
n->next = NULL;
! for (pn = &elf_hash_table (info)->runpath;
*pn != NULL;
pn = &(*pn)->next)
;
--- 1258,1264 ----
n->name = anm;
n->by = abfd;
n->next = NULL;
! for (pn = & hash_table->runpath;
*pn != NULL;
pn = &(*pn)->next)
;
*************** elf_link_add_object_symbols (abfd, info)
*** 1277,1298 ****
/* If this is the first dynamic object found in the link, create
the special sections required for dynamic linking. */
! if (! elf_hash_table (info)->dynamic_sections_created)
! {
! if (! elf_link_create_dynamic_sections (abfd, info))
! goto error_return;
! }
if (add_needed)
{
/* Add a DT_NEEDED entry for this dynamic object. */
! oldsize = _bfd_stringtab_size (elf_hash_table (info)->dynstr);
! strindex = _bfd_stringtab_add (elf_hash_table (info)->dynstr, name,
true, false);
if (strindex == (bfd_size_type) -1)
goto error_return;
! if (oldsize == _bfd_stringtab_size (elf_hash_table (info)->dynstr))
{
asection *sdyn;
Elf_External_Dyn *dyncon, *dynconend;
--- 1283,1302 ----
/* If this is the first dynamic object found in the link, create
the special sections required for dynamic linking. */
! if (! hash_table->dynamic_sections_created)
! if (! elf_link_create_dynamic_sections (abfd, info))
! goto error_return;
if (add_needed)
{
/* Add a DT_NEEDED entry for this dynamic object. */
! oldsize = _bfd_stringtab_size (hash_table->dynstr);
! strindex = _bfd_stringtab_add (hash_table->dynstr, name,
true, false);
if (strindex == (bfd_size_type) -1)
goto error_return;
! if (oldsize == _bfd_stringtab_size (hash_table->dynstr))
{
asection *sdyn;
Elf_External_Dyn *dyncon, *dynconend;
*************** elf_link_add_object_symbols (abfd, info)
*** 1302,1309 ****
have already included this dynamic object in the
link, just ignore it. There is no reason to include
a particular dynamic object more than once. */
! sdyn = bfd_get_section_by_name (elf_hash_table (info)->dynobj,
! ".dynamic");
BFD_ASSERT (sdyn != NULL);
dyncon = (Elf_External_Dyn *) sdyn->contents;
--- 1306,1312 ----
have already included this dynamic object in the
link, just ignore it. There is no reason to include
a particular dynamic object more than once. */
! sdyn = bfd_get_section_by_name (hash_table->dynobj, ".dynamic");
BFD_ASSERT (sdyn != NULL);
dyncon = (Elf_External_Dyn *) sdyn->contents;
*************** elf_link_add_object_symbols (abfd, info)
*** 1313,1320 ****
{
Elf_Internal_Dyn dyn;
! elf_swap_dyn_in (elf_hash_table (info)->dynobj, dyncon,
! &dyn);
if (dyn.d_tag == DT_NEEDED
&& dyn.d_un.d_val == strindex)
{
--- 1316,1322 ----
{
Elf_Internal_Dyn dyn;
! elf_swap_dyn_in (hash_table->dynobj, dyncon, & dyn);
if (dyn.d_tag == DT_NEEDED
&& dyn.d_un.d_val == strindex)
{
*************** elf_link_add_object_symbols (abfd, info)
*** 1969,1993 ****
bfd_size_type oldsize;
bfd_size_type strindex;
/* The symbol from a DT_NEEDED object is referenced from
the regular object to create a dynamic executable. We
have to make sure there is a DT_NEEDED entry for it. */
dt_needed = false;
! oldsize = _bfd_stringtab_size (elf_hash_table (info)->dynstr);
! strindex = _bfd_stringtab_add (elf_hash_table (info)->dynstr,
elf_dt_soname (abfd),
true, false);
if (strindex == (bfd_size_type) -1)
goto error_return;
if (oldsize
! == _bfd_stringtab_size (elf_hash_table (info)->dynstr))
{
asection *sdyn;
Elf_External_Dyn *dyncon, *dynconend;
! sdyn = bfd_get_section_by_name (elf_hash_table (info)->dynobj,
".dynamic");
BFD_ASSERT (sdyn != NULL);
--- 1971,1998 ----
bfd_size_type oldsize;
bfd_size_type strindex;
+ if (! is_elf_hash_table (info))
+ goto error_return;
+
/* The symbol from a DT_NEEDED object is referenced from
the regular object to create a dynamic executable. We
have to make sure there is a DT_NEEDED entry for it. */
dt_needed = false;
! oldsize = _bfd_stringtab_size (hash_table->dynstr);
! strindex = _bfd_stringtab_add (hash_table->dynstr,
elf_dt_soname (abfd),
true, false);
if (strindex == (bfd_size_type) -1)
goto error_return;
if (oldsize
! == _bfd_stringtab_size (hash_table->dynstr))
{
asection *sdyn;
Elf_External_Dyn *dyncon, *dynconend;
! sdyn = bfd_get_section_by_name (hash_table->dynobj,
".dynamic");
BFD_ASSERT (sdyn != NULL);
*************** elf_link_add_object_symbols (abfd, info)
*** 1998,2004 ****
{
Elf_Internal_Dyn dyn;
! elf_swap_dyn_in (elf_hash_table (info)->dynobj,
dyncon, &dyn);
BFD_ASSERT (dyn.d_tag != DT_NEEDED ||
dyn.d_un.d_val != strindex);
--- 2003,2009 ----
{
Elf_Internal_Dyn dyn;
! elf_swap_dyn_in (hash_table->dynobj,
dyncon, &dyn);
BFD_ASSERT (dyn.d_tag != DT_NEEDED ||
dyn.d_un.d_val != strindex);
*************** elf_link_add_object_symbols (abfd, info)
*** 2155,2160 ****
--- 2160,2166 ----
&& ! info->relocateable
&& ! info->traditional_format
&& info->hash->creator->flavour == bfd_target_elf_flavour
+ && is_elf_hash_table (info)
&& (info->strip != strip_all && info->strip != strip_debugger))
{
asection *stab, *stabstr;
*************** elf_link_add_object_symbols (abfd, info)
*** 2170,2176 ****
secdata = elf_section_data (stab);
if (! _bfd_link_section_stabs (abfd,
! &elf_hash_table (info)->stab_info,
stab, stabstr,
&secdata->stab_info))
goto error_return;
--- 2176,2182 ----
secdata = elf_section_data (stab);
if (! _bfd_link_section_stabs (abfd,
! & hash_table->stab_info,
stab, stabstr,
&secdata->stab_info))
goto error_return;
*************** elf_link_add_object_symbols (abfd, info)
*** 2178,2192 ****
}
}
! if (! info->relocateable && ! dynamic)
{
asection *s;
for (s = abfd->sections; s != NULL; s = s->next)
if ((s->flags & SEC_MERGE)
! && ! _bfd_merge_section (abfd,
! &elf_hash_table (info)->merge_info,
! s, &elf_section_data (s)->merge_info))
goto error_return;
}
--- 2184,2198 ----
}
}
! if (! info->relocateable && ! dynamic
! && is_elf_hash_table (info))
{
asection *s;
for (s = abfd->sections; s != NULL; s = s->next)
if ((s->flags & SEC_MERGE)
! && ! _bfd_merge_section (abfd, & hash_table->merge_info, s,
! & elf_section_data (s)->merge_info))
goto error_return;
}
*************** elf_link_create_dynamic_sections (abfd,
*** 2219,2224 ****
--- 2225,2233 ----
struct elf_link_hash_entry *h;
struct elf_backend_data *bed;
+ if (! is_elf_hash_table (info))
+ return false;
+
if (elf_hash_table (info)->dynamic_sections_created)
return true;
*************** elf_add_dynamic_entry (info, tag, val)
*** 2343,2348 ****
--- 2352,2360 ----
size_t newsize;
bfd_byte *newcontents;
+ if (! is_elf_hash_table (info))
+ return false;
+
dynobj = elf_hash_table (info)->dynobj;
s = bfd_get_section_by_name (dynobj, ".dynamic");
*************** elf_link_record_local_dynamic_symbol (in
*** 2379,2384 ****
--- 2391,2399 ----
unsigned long dynstr_index;
char *name;
+ if (! is_elf_hash_table (info))
+ return false;
+
/* See if the entry exists already. */
for (entry = elf_hash_table (info)->dynlocal; entry ; entry = entry->next)
if (entry->input_bfd == input_bfd && entry->input_indx == input_indx)
*************** NAME(bfd_elf,size_dynamic_sections) (out
*** 2895,2900 ****
--- 2910,2918 ----
if (info->hash->creator->flavour != bfd_target_elf_flavour)
return true;
+ if (! is_elf_hash_table (info))
+ return false;
+
/* The backend may have to create some sections regardless of whether
we're dynamic or not. */
bed = get_elf_backend_data (output_bfd);
*************** elf_fix_symbol_flags (h, eif)
*** 3542,3553 ****
--- 3560,3573 ----
backend specifically; we can't just clear PLT-related data here. */
if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0
&& eif->info->shared
+ && is_elf_hash_table (eif->info)
&& (eif->info->symbolic
|| ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
|| ELF_ST_VISIBILITY (h->other) == STV_HIDDEN)
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0)
{
struct elf_backend_data *bed;
+
bed = get_elf_backend_data (elf_hash_table (eif->info)->dynobj);
if (ELF_ST_VISIBILITY (h->other) == STV_INTERNAL
|| ELF_ST_VISIBILITY (h->other) == STV_HIDDEN)
*************** elf_adjust_dynamic_symbol (h, data)
*** 3602,3607 ****
--- 3622,3630 ----
if (h->root.type == bfd_link_hash_indirect)
return true;
+ if (! is_elf_hash_table (eif->info))
+ return false;
+
/* Fix the symbol flags. */
if (! elf_fix_symbol_flags (h, eif))
return false;
*************** elf_bfd_final_link (abfd, info)
*** 4511,4516 ****
--- 4534,4542 ----
boolean merged;
size_t relativecount = 0;
asection *reldyn = 0;
+
+ if (! is_elf_hash_table (info))
+ return false;
if (info->shared)
abfd->flags |= DYNAMIC;
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: elf_link_hash_entry vs generic_link_hash_entry
2001-08-24 9:35 ` Nick Clifton
@ 2001-08-24 9:54 ` H . J . Lu
2001-08-24 10:02 ` H . J . Lu
1 sibling, 0 replies; 12+ messages in thread
From: H . J . Lu @ 2001-08-24 9:54 UTC (permalink / raw)
To: Nick Clifton; +Cc: binutils, Ian Lance Taylor
On Fri, Aug 24, 2001 at 05:32:19PM +0100, Nick Clifton wrote:
>
> This patch does not appear to be based against the current binutils
> sources. (I guess it was made against your own source tree ?)
> Instead I created a modified version of your patch.
Probably.
>
> I had to make one change though - I reverted the definition of
> elf_hash_table() back to its original version, since it cannot be
> allowed to return NULL. (It is used in too many places as the first
I think it should return NULL when you try to access the generic hash
table as an ELF hash table. Otherwise, you don't even know you are
overriding memory which doesn't belong to you. It is not too hard to
fix the broken code, which is wrong to begin with.
H.J.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: elf_link_hash_entry vs generic_link_hash_entry
2001-08-24 9:35 ` Nick Clifton
2001-08-24 9:54 ` H . J . Lu
@ 2001-08-24 10:02 ` H . J . Lu
1 sibling, 0 replies; 12+ messages in thread
From: H . J . Lu @ 2001-08-24 10:02 UTC (permalink / raw)
To: Nick Clifton; +Cc: binutils, Ian Lance Taylor
On Fri, Aug 24, 2001 at 05:32:19PM +0100, Nick Clifton wrote:
>
> I had to make one change though - I reverted the definition of
> elf_hash_table() back to its original version, since it cannot be
> allowed to return NULL. (It is used in too many places as the first
> argument to elf_link_hash_lookup). Instead I created a new macro
> called 'is_elf_hash_table' and I added code to check it in
> elf_link_add_object_symbols(), like this.
>
I don't like it. I prefer elf_hash_table
1. Returns NULL on generic hash table
#define elf_hash_table(p) \
((struct elf_link_hash_table *) \
(((p)->hash->type == bfd_link_elf_hash_table) ? (p)->hash : NULL))
so that ld gets a core dump. Or
2. Aborts on generic hash table
#define elf_hash_table(p) \
((struct elf_link_hash_table *) \
(((p)->hash->type == bfd_link_elf_hash_table)
? (p)->hash : (abort (), NULL)))
so that we can catch all the bogus code.
H.J.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: elf_link_hash_entry vs generic_link_hash_entry
2001-08-23 11:36 ` H . J . Lu
2001-08-23 12:10 ` H . J . Lu
2001-08-24 9:18 ` Nick Clifton
@ 2001-08-28 15:53 ` Richard Henderson
2 siblings, 0 replies; 12+ messages in thread
From: Richard Henderson @ 2001-08-28 15:53 UTC (permalink / raw)
To: H . J . Lu; +Cc: Nick Clifton, binutils, Ian Lance Taylor
On Thu, Aug 23, 2001 at 11:36:56AM -0700, H . J . Lu wrote:
> Here is a patch. Ian, as you mentioned, linking directly to S-records
> no longer works.
[...]
> How should we fix it?
In general I think it's unfixable. Yes, you were able to come
up with something that worked for i386, but not for targets that
require non-trivial bookkeeping during final link -- ia64 and
alpha come to mind here.
Besides, I think such is a waste of time and effort. If you
want S-records, we have this nice objcopy utiltity.
r~
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2001-08-28 15:53 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <si66bh2zdl.fsf@daffy.airs.com>
2001-08-22 0:44 ` elf_link_hash_entry vs generic_link_hash_entry Nick Clifton
2001-08-22 1:06 ` Thiemo Seufer
2001-08-22 7:02 ` Ian Lance Taylor
2001-08-23 9:22 ` H . J . Lu
2001-08-23 11:36 ` H . J . Lu
2001-08-23 12:10 ` H . J . Lu
2001-08-24 9:35 ` Nick Clifton
2001-08-24 9:54 ` H . J . Lu
2001-08-24 10:02 ` H . J . Lu
2001-08-24 9:18 ` Nick Clifton
2001-08-24 9:22 ` H . J . Lu
2001-08-28 15:53 ` Richard Henderson
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).