projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ld: xfail several shared (non PIC) tests on Solaris
[deliverable/binutils-gdb.git]
/
ld
/
ldcref.c
diff --git
a/ld/ldcref.c
b/ld/ldcref.c
index 479cac90e2a55e88cefa34072185cb450108e364..9120bf87fbd9add1f19eda4729a62c729656a46c 100644
(file)
--- a/
ld/ldcref.c
+++ b/
ld/ldcref.c
@@
-1,6
+1,5
@@
/* ldcref.c -- output a cross reference table
/* ldcref.c -- output a cross reference table
- Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
- 2007, 2008 Free Software Foundation, Inc.
+ Copyright (C) 1996-2020 Free Software Foundation, Inc.
Written by Ian Lance Taylor <ian@cygnus.com>
This file is part of the GNU Binutils.
Written by Ian Lance Taylor <ian@cygnus.com>
This file is part of the GNU Binutils.
@@
-28,6
+27,7
@@
#include "sysdep.h"
#include "bfd.h"
#include "bfdlink.h"
#include "sysdep.h"
#include "bfd.h"
#include "bfdlink.h"
+#include "ctf-api.h"
#include "libiberty.h"
#include "demangle.h"
#include "objalloc.h"
#include "libiberty.h"
#include "demangle.h"
#include "objalloc.h"
@@
-41,7
+41,8
@@
/* We keep an instance of this structure for each reference to a
symbol from a given object. */
/* We keep an instance of this structure for each reference to a
symbol from a given object. */
-struct cref_ref {
+struct cref_ref
+{
/* The next reference. */
struct cref_ref *next;
/* The object. */
/* The next reference. */
struct cref_ref *next;
/* The object. */
@@
-56,7
+57,8
@@
struct cref_ref {
/* We keep a hash table of symbols. Each entry looks like this. */
/* We keep a hash table of symbols. Each entry looks like this. */
-struct cref_hash_entry {
+struct cref_hash_entry
+{
struct bfd_hash_entry root;
/* The demangled name. */
const char *demangled;
struct bfd_hash_entry root;
/* The demangled name. */
const char *demangled;
@@
-66,7
+68,8
@@
struct cref_hash_entry {
/* This is what the hash table looks like. */
/* This is what the hash table looks like. */
-struct cref_hash_table {
+struct cref_hash_table
+{
struct bfd_hash_table root;
};
struct bfd_hash_table root;
};
@@
-161,7
+164,7
@@
add_cref (const char *name,
struct cref_hash_entry *h;
struct cref_ref *r;
struct cref_hash_entry *h;
struct cref_ref *r;
- if (!
cref_initialized)
+ if (!cref_initialized)
{
if (!bfd_hash_table_init (&cref_table.root, cref_hash_newfunc,
sizeof (struct cref_hash_entry)))
{
if (!bfd_hash_table_init (&cref_table.root, cref_hash_newfunc,
sizeof (struct cref_hash_entry)))
@@
-179,7
+182,7
@@
add_cref (const char *name,
if (r == NULL)
{
if (r == NULL)
{
- r = bfd_hash_allocate (&cref_table.root, sizeof *r);
+ r =
(struct cref_ref *)
bfd_hash_allocate (&cref_table.root, sizeof *r);
if (r == NULL)
einfo (_("%X%P: cref alloc failed: %E\n"));
r->next = h->refs;
if (r == NULL)
einfo (_("%X%P: cref alloc failed: %E\n"));
r->next = h->refs;
@@
-226,7
+229,7
@@
handle_asneeded_cref (bfd *abfd ATTRIBUTE_UNUSED,
entsize += cref_table.root.entsize;
c = (struct cref_hash_entry *) p;
for (r = c->refs; r != NULL; r = r->next)
entsize += cref_table.root.entsize;
c = (struct cref_hash_entry *) p;
for (r = c->refs; r != NULL; r = r->next)
- refsize += sizeof (struct cref_
hash_entry
);
+ refsize += sizeof (struct cref_
ref
);
}
}
}
}
@@
-258,8
+261,8
@@
handle_asneeded_cref (bfd *abfd ATTRIBUTE_UNUSED,
c = (struct cref_hash_entry *) p;
for (r = c->refs; r != NULL; r = r->next)
{
c = (struct cref_hash_entry *) p;
for (r = c->refs; r != NULL; r = r->next)
{
- memcpy (old_ref, r, sizeof (struct cref_
hash_entry
));
- old_ref = (char *) old_ref + sizeof (struct cref_
hash_entry
);
+ memcpy (old_ref, r, sizeof (struct cref_
ref
));
+ old_ref = (char *) old_ref + sizeof (struct cref_
ref
);
}
}
}
}
}
}
@@
-300,8
+303,8
@@
handle_asneeded_cref (bfd *abfd ATTRIBUTE_UNUSED,
c = (struct cref_hash_entry *) p;
for (r = c->refs; r != NULL; r = r->next)
{
c = (struct cref_hash_entry *) p;
for (r = c->refs; r != NULL; r = r->next)
{
- memcpy (r, old_ref, sizeof (struct cref_
hash_entry
));
- old_ref = (char *) old_ref + sizeof (struct cref_
hash_entry
);
+ memcpy (r, old_ref, sizeof (struct cref_
ref
));
+ old_ref = (char *) old_ref + sizeof (struct cref_
ref
);
}
}
}
}
}
}
@@
-324,7
+327,7
@@
handle_asneeded_cref (bfd *abfd ATTRIBUTE_UNUSED,
static bfd_boolean
cref_fill_array (struct cref_hash_entry *h, void *data)
{
static bfd_boolean
cref_fill_array (struct cref_hash_entry *h, void *data)
{
- struct cref_hash_entry ***pph = data;
+ struct cref_hash_entry ***pph =
(struct cref_hash_entry ***)
data;
ASSERT (h->demangled == NULL);
h->demangled = bfd_demangle (link_info.output_bfd, h->root.string,
ASSERT (h->demangled == NULL);
h->demangled = bfd_demangle (link_info.output_bfd, h->root.string,
@@
-344,10
+347,15
@@
cref_fill_array (struct cref_hash_entry *h, void *data)
static int
cref_sort_array (const void *a1, const void *a2)
{
static int
cref_sort_array (const void *a1, const void *a2)
{
- const struct cref_hash_entry * const *p1 = a1;
- const struct cref_hash_entry * const *p2 = a2;
+ const struct cref_hash_entry *const *p1
+ = (const struct cref_hash_entry *const *) a1;
+ const struct cref_hash_entry *const *p2
+ = (const struct cref_hash_entry *const *) a2;
- return strcmp ((*p1)->demangled, (*p2)->demangled);
+ if (demangling)
+ return strcmp ((*p1)->demangled, (*p2)->demangled);
+ else
+ return strcmp ((*p1)->root.string, (*p2)->root.string);
}
/* Write out the cref table. */
}
/* Write out the cref table. */
@@
-372,13
+380,13
@@
output_cref (FILE *fp)
}
fprintf (fp, _("File\n"));
}
fprintf (fp, _("File\n"));
- if (!
cref_initialized)
+ if (!cref_initialized)
{
fprintf (fp, _("No symbols\n"));
return;
}
{
fprintf (fp, _("No symbols\n"));
return;
}
- csyms = xmalloc (cref_symcount * sizeof (*csyms));
+ csyms =
(struct cref_hash_entry **)
xmalloc (cref_symcount * sizeof (*csyms));
csym_fill = csyms;
cref_hash_traverse (&cref_table, cref_fill_array, &csym_fill);
csym_fill = csyms;
cref_hash_traverse (&cref_table, cref_fill_array, &csym_fill);
@@
-403,7
+411,7
@@
output_one_cref (FILE *fp, struct cref_hash_entry *h)
hl = bfd_link_hash_lookup (link_info.hash, h->root.string, FALSE,
FALSE, TRUE);
if (hl == NULL)
hl = bfd_link_hash_lookup (link_info.hash, h->root.string, FALSE,
FALSE, TRUE);
if (hl == NULL)
- einfo (
"%P: symbol `%T' missing from main hash table\n"
,
+ einfo (
_("%P: symbol `%pT' missing from main hash table\n")
,
h->root.string);
else
{
h->root.string);
else
{
@@
-425,8
+433,16
@@
output_one_cref (FILE *fp, struct cref_hash_entry *h)
}
}
}
}
- fprintf (fp, "%s ", h->demangled);
- len = strlen (h->demangled) + 1;
+ if (demangling)
+ {
+ fprintf (fp, "%s ", h->demangled);
+ len = strlen (h->demangled) + 1;
+ }
+ else
+ {
+ fprintf (fp, "%s ", h->root.string);
+ len = strlen (h->root.string) + 1;
+ }
for (r = h->refs; r != NULL; r = r->next)
{
for (r = h->refs; r != NULL; r = r->next)
{
@@
-437,21
+453,35
@@
output_one_cref (FILE *fp, struct cref_hash_entry *h)
putc (' ', fp);
++len;
}
putc (' ', fp);
++len;
}
- lfinfo (fp, "%B\n", r->abfd);
+ lfinfo (fp, "%pB\n", r->abfd);
+ len = 0;
+ }
+ }
+
+ for (r = h->refs; r != NULL; r = r->next)
+ {
+ if (r->common)
+ {
+ while (len < FILECOL)
+ {
+ putc (' ', fp);
+ ++len;
+ }
+ lfinfo (fp, "%pB\n", r->abfd);
len = 0;
}
}
for (r = h->refs; r != NULL; r = r->next)
{
len = 0;
}
}
for (r = h->refs; r != NULL; r = r->next)
{
- if (!
r->def
)
+ if (!
r->def && !r->common
)
{
while (len < FILECOL)
{
putc (' ', fp);
++len;
}
{
while (len < FILECOL)
{
putc (' ', fp);
++len;
}
- lfinfo (fp, "%B\n", r->abfd);
+ lfinfo (fp, "%
p
B\n", r->abfd);
len = 0;
}
}
len = 0;
}
}
@@
-464,7
+494,7
@@
output_one_cref (FILE *fp, struct cref_hash_entry *h)
void
check_nocrossrefs (void)
{
void
check_nocrossrefs (void)
{
- if (!
cref_initialized)
+ if (!cref_initialized)
return;
cref_hash_traverse (&cref_table, check_nocrossref, NULL);
return;
cref_hash_traverse (&cref_table, check_nocrossref, NULL);
@@
-485,7
+515,7
@@
check_local_sym_xref (lang_input_statement_type *statement)
return;
if (!bfd_generic_link_read_symbols (abfd))
return;
if (!bfd_generic_link_read_symbols (abfd))
- einfo (_("%
B%F
: could not read symbols: %E\n"), abfd);
+ einfo (_("%
F%P: %pB
: could not read symbols: %E\n"), abfd);
for (syms = bfd_get_outsymbols (abfd); *syms; ++syms)
{
for (syms = bfd_get_outsymbols (abfd); *syms; ++syms)
{
@@
-505,8
+535,14
@@
check_local_sym_xref (lang_input_statement_type *statement)
symname = sym->name;
for (ncrs = nocrossref_list; ncrs != NULL; ncrs = ncrs->next)
for (ncr = ncrs->list; ncr != NULL; ncr = ncr->next)
symname = sym->name;
for (ncrs = nocrossref_list; ncrs != NULL; ncrs = ncrs->next)
for (ncr = ncrs->list; ncr != NULL; ncr = ncr->next)
- if (strcmp (ncr->name, outsecname) == 0)
- check_refs (symname, FALSE, sym->section, abfd, ncrs);
+ {
+ if (strcmp (ncr->name, outsecname) == 0)
+ check_refs (symname, FALSE, sym->section, abfd, ncrs);
+ /* The NOCROSSREFS_TO command only checks symbols defined in
+ the first section in the list. */
+ if (ncrs->onlyfirst)
+ break;
+ }
}
}
}
}
}
}
@@
-527,7
+563,7
@@
check_nocrossref (struct cref_hash_entry *h, void *ignore ATTRIBUTE_UNUSED)
FALSE, TRUE);
if (hl == NULL)
{
FALSE, TRUE);
if (hl == NULL)
{
- einfo (_("%P: symbol `%T' missing from main hash table\n"),
+ einfo (_("%P: symbol `%
p
T' missing from main hash table\n"),
h->root.string);
return TRUE;
}
h->root.string);
return TRUE;
}
@@
-539,14
+575,20
@@
check_nocrossref (struct cref_hash_entry *h, void *ignore ATTRIBUTE_UNUSED)
defsec = hl->u.def.section->output_section;
if (defsec == NULL)
return TRUE;
defsec = hl->u.def.section->output_section;
if (defsec == NULL)
return TRUE;
- defsecname = bfd_
get_section_name (defsec->owner,
defsec);
+ defsecname = bfd_
section_name (
defsec);
for (ncrs = nocrossref_list; ncrs != NULL; ncrs = ncrs->next)
for (ncr = ncrs->list; ncr != NULL; ncr = ncr->next)
for (ncrs = nocrossref_list; ncrs != NULL; ncrs = ncrs->next)
for (ncr = ncrs->list; ncr != NULL; ncr = ncr->next)
- if (strcmp (ncr->name, defsecname) == 0)
- for (ref = h->refs; ref != NULL; ref = ref->next)
- check_refs (hl->root.string, TRUE, hl->u.def.section,
- ref->abfd, ncrs);
+ {
+ if (strcmp (ncr->name, defsecname) == 0)
+ for (ref = h->refs; ref != NULL; ref = ref->next)
+ check_refs (hl->root.string, TRUE, hl->u.def.section,
+ ref->abfd, ncrs);
+ /* The NOCROSSREFS_TO command only checks symbols defined in the first
+ section in the list. */
+ if (ncrs->onlyfirst)
+ break;
+ }
return TRUE;
}
return TRUE;
}
@@
-554,7
+596,8
@@
check_nocrossref (struct cref_hash_entry *h, void *ignore ATTRIBUTE_UNUSED)
/* The struct is used to pass information from check_refs to
check_reloc_refs through bfd_map_over_sections. */
/* The struct is used to pass information from check_refs to
check_reloc_refs through bfd_map_over_sections. */
-struct check_refs_info {
+struct check_refs_info
+{
const char *sym_name;
asection *defsec;
struct lang_nocrossrefs *ncrs;
const char *sym_name;
asection *defsec;
struct lang_nocrossrefs *ncrs;
@@
-583,7
+626,7
@@
check_refs (const char *name,
BFD might contain a prohibited cross reference. */
if (!bfd_generic_link_read_symbols (abfd))
BFD might contain a prohibited cross reference. */
if (!bfd_generic_link_read_symbols (abfd))
- einfo (_("%
B%F
: could not read symbols: %E\n"), abfd);
+ einfo (_("%
F%P: %pB
: could not read symbols: %E\n"), abfd);
info.sym_name = name;
info.global = global;
info.sym_name = name;
info.global = global;
@@
-602,7
+645,7
@@
check_refs (const char *name,
static void
check_reloc_refs (bfd *abfd, asection *sec, void *iarg)
{
static void
check_reloc_refs (bfd *abfd, asection *sec, void *iarg)
{
- struct check_refs_info *info = iarg;
+ struct check_refs_info *info =
(struct check_refs_info *)
iarg;
asection *outsec;
const char *outsecname;
asection *outdefsec;
asection *outsec;
const char *outsecname;
asection *outdefsec;
@@
-616,10
+659,10
@@
check_reloc_refs (bfd *abfd, asection *sec, void *iarg)
arelent **p, **pend;
outsec = sec->output_section;
arelent **p, **pend;
outsec = sec->output_section;
- outsecname = bfd_
get_section_name (outsec->owner,
outsec);
+ outsecname = bfd_
section_name (
outsec);
outdefsec = info->defsec->output_section;
outdefsec = info->defsec->output_section;
- outdefsecname = bfd_
get_section_name (outdefsec->owner,
outdefsec);
+ outdefsecname = bfd_
section_name (
outdefsec);
/* The section where the symbol is defined is permitted. */
if (strcmp (outsecname, outdefsecname) == 0)
/* The section where the symbol is defined is permitted. */
if (strcmp (outsecname, outdefsecname) == 0)
@@
-645,14
+688,14
@@
check_reloc_refs (bfd *abfd, asection *sec, void *iarg)
relsize = bfd_get_reloc_upper_bound (abfd, sec);
if (relsize < 0)
relsize = bfd_get_reloc_upper_bound (abfd, sec);
if (relsize < 0)
- einfo (_("%
B%F
: could not read relocs: %E\n"), abfd);
+ einfo (_("%
F%P: %pB
: could not read relocs: %E\n"), abfd);
if (relsize == 0)
return;
if (relsize == 0)
return;
- relpp = xmalloc (relsize);
+ relpp =
(arelent **)
xmalloc (relsize);
relcount = bfd_canonicalize_reloc (abfd, sec, relpp, info->asymbols);
if (relcount < 0)
relcount = bfd_canonicalize_reloc (abfd, sec, relpp, info->asymbols);
if (relcount < 0)
- einfo (_("%
B%F
: could not read relocs: %E\n"), abfd);
+ einfo (_("%
F%P: %pB
: could not read relocs: %E\n"), abfd);
p = relpp;
pend = p + relcount;
p = relpp;
pend = p + relcount;
@@
-663,14
+706,14
@@
check_reloc_refs (bfd *abfd, asection *sec, void *iarg)
if (q->sym_ptr_ptr != NULL
&& *q->sym_ptr_ptr != NULL
&& ((global
if (q->sym_ptr_ptr != NULL
&& *q->sym_ptr_ptr != NULL
&& ((global
- && (bfd_is_und_section (bfd_
get
_section (*q->sym_ptr_ptr))
- || bfd_is_com_section (bfd_
get
_section (*q->sym_ptr_ptr))
+ && (bfd_is_und_section (bfd_
asymbol
_section (*q->sym_ptr_ptr))
+ || bfd_is_com_section (bfd_
asymbol
_section (*q->sym_ptr_ptr))
|| ((*q->sym_ptr_ptr)->flags & (BSF_GLOBAL
| BSF_WEAK)) != 0))
|| (!global
&& ((*q->sym_ptr_ptr)->flags & (BSF_LOCAL
| BSF_SECTION_SYM)) != 0
|| ((*q->sym_ptr_ptr)->flags & (BSF_GLOBAL
| BSF_WEAK)) != 0))
|| (!global
&& ((*q->sym_ptr_ptr)->flags & (BSF_LOCAL
| BSF_SECTION_SYM)) != 0
- && bfd_
get
_section (*q->sym_ptr_ptr) == info->defsec))
+ && bfd_
asymbol
_section (*q->sym_ptr_ptr) == info->defsec))
&& (symname != NULL
? strcmp (bfd_asymbol_name (*q->sym_ptr_ptr), symname) == 0
: ((*q->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0))
&& (symname != NULL
? strcmp (bfd_asymbol_name (*q->sym_ptr_ptr), symname) == 0
: ((*q->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0))
@@
-679,7
+722,7
@@
check_reloc_refs (bfd *abfd, asection *sec, void *iarg)
in OUTSECNAME. This reloc is from a section which is
mapped into a section from which references to OUTSECNAME
are prohibited. We must report an error. */
in OUTSECNAME. This reloc is from a section which is
mapped into a section from which references to OUTSECNAME
are prohibited. We must report an error. */
- einfo (_("%X%
C: prohibited cross reference from %s to `%
T' in %s\n"),
+ einfo (_("%X%
P: %C: prohibited cross reference from %s to `%p
T' in %s\n"),
abfd, sec, q->address, outsecname,
bfd_asymbol_name (*q->sym_ptr_ptr), outdefsecname);
}
abfd, sec, q->address, outsecname,
bfd_asymbol_name (*q->sym_ptr_ptr), outdefsecname);
}
This page took
0.028703 seconds
and
4
git commands to generate.