mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-28 01:50:48 +00:00
Uses the new small reloc type now.
Currently self hosts on sun4 and sun3
This commit is contained in:
311
bfd/syms.c
311
bfd/syms.c
@@ -22,11 +22,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
SECTION
|
||||
Symbols
|
||||
|
||||
DESCRIPTION
|
||||
BFD trys to maintain as much symbol information as it can when
|
||||
it moves information from file to file. BFD passes information
|
||||
to applications though the <<asymbol>> structure. When the
|
||||
applicationrequests the symbol table, BFD reads the table in
|
||||
application requests the symbol table, BFD reads the table in
|
||||
the native form and translates parts of it into the internal
|
||||
format. To maintain more than the infomation passed to
|
||||
applications some targets keep some information 'behind the
|
||||
@@ -38,7 +37,7 @@ DESCRIPTION
|
||||
information unique to coff which BFD doesn't know or
|
||||
understand. If a coff symbol table was read, but was written
|
||||
through an a.out back end, all the coff specific information
|
||||
would be lost. (.. until BFD 2 :). The symbol table of a BFD
|
||||
would be lost. The symbol table of a BFD
|
||||
is not necessarily read in until a canonicalize request is
|
||||
made. Then the BFD back end fills in a table provided by the
|
||||
application with pointers to the canonical information. To
|
||||
@@ -57,33 +56,28 @@ DESCRIPTION
|
||||
SUBSECTION
|
||||
Reading Symbols
|
||||
|
||||
DESCRIPTION
|
||||
There are two stages to reading a symbol table from a BFD;
|
||||
allocating storage, and the actual reading process. This is an
|
||||
excerpt from an appliction which reads the symbol table:
|
||||
|
||||
EXAMPLE
|
||||
|
||||
unsigned int storage_needed;
|
||||
asymbol **symbol_table;
|
||||
unsigned int number_of_symbols;
|
||||
unsigned int i;
|
||||
|
||||
storage_needed = get_symtab_upper_bound (abfd);
|
||||
|
||||
if (storage_needed == 0) {
|
||||
return ;
|
||||
}
|
||||
symbol_table = (asymbol **) bfd_xmalloc (storage_needed);
|
||||
...
|
||||
number_of_symbols =
|
||||
bfd_canonicalize_symtab (abfd, symbol_table);
|
||||
|
||||
for (i = 0; i < number_of_symbols; i++) {
|
||||
process_symbol (symbol_table[i]);
|
||||
}
|
||||
|
||||
DESCRIPTION
|
||||
| unsigned int storage_needed;
|
||||
| asymbol **symbol_table;
|
||||
| unsigned int number_of_symbols;
|
||||
| unsigned int i;
|
||||
|
|
||||
| storage_needed = get_symtab_upper_bound (abfd);
|
||||
|
|
||||
| if (storage_needed == 0) {
|
||||
| return ;
|
||||
| }
|
||||
| symbol_table = (asymbol **) bfd_xmalloc (storage_needed);
|
||||
| ...
|
||||
| number_of_symbols =
|
||||
| bfd_canonicalize_symtab (abfd, symbol_table);
|
||||
|
|
||||
| for (i = 0; i < number_of_symbols; i++) {
|
||||
| process_symbol (symbol_table[i]);
|
||||
| }
|
||||
|
||||
All storage for the symbols themselves is in an obstack
|
||||
connected to the BFD, and is freed when the BFD is closed.
|
||||
@@ -93,7 +87,6 @@ DESCRIPTION
|
||||
SUBSECTION
|
||||
Writing Symbols
|
||||
|
||||
DESCRIPTION
|
||||
Writing of a symbol table is automatic when a BFD open for
|
||||
writing is closed. The application attaches a vector of
|
||||
pointers to pointers to symbols to the BFD being written, and
|
||||
@@ -104,35 +97,32 @@ DESCRIPTION
|
||||
which has been created using <<bfd_make_empty_symbol>>. An
|
||||
example showing the creation of a symbol table with only one element:
|
||||
|
||||
EXAMPLE
|
||||
#include "bfd.h"
|
||||
main()
|
||||
{
|
||||
bfd *abfd;
|
||||
asymbol *ptrs[2];
|
||||
asymbol *new;
|
||||
| #include "bfd.h"
|
||||
| main()
|
||||
| {
|
||||
| bfd *abfd;
|
||||
| asymbol *ptrs[2];
|
||||
| asymbol *new;
|
||||
|
|
||||
| abfd = bfd_openw("foo","a.out-sunos-big");
|
||||
| bfd_set_format(abfd, bfd_object);
|
||||
| new = bfd_make_empty_symbol(abfd);
|
||||
| new->name = "dummy_symbol";
|
||||
| new->section = bfd_make_section_old_way(abfd, ".text");
|
||||
| new->flags = BSF_GLOBAL;
|
||||
| new->value = 0x12345;
|
||||
|
|
||||
| ptrs[0] = new;
|
||||
| ptrs[1] = (asymbol *)0;
|
||||
|
|
||||
| bfd_set_symtab(abfd, ptrs, 1);
|
||||
| bfd_close(abfd);
|
||||
| }
|
||||
|
|
||||
| ./makesym
|
||||
| nm foo
|
||||
| 00012345 A dummy_symbol
|
||||
|
||||
abfd = bfd_openw("foo","a.out-sunos-big");
|
||||
bfd_set_format(abfd, bfd_object);
|
||||
new = bfd_make_empty_symbol(abfd);
|
||||
new->name = "dummy_symbol";
|
||||
new->section = (asection *)0;
|
||||
new->flags = BSF_ABSOLUTE | BSF_GLOBAL;
|
||||
new->value = 0x12345;
|
||||
|
||||
ptrs[0] = new;
|
||||
ptrs[1] = (asymbol *)0;
|
||||
|
||||
bfd_set_symtab(abfd, ptrs, 1);
|
||||
bfd_close(abfd);
|
||||
}
|
||||
|
||||
./makesym
|
||||
nm foo
|
||||
00012345 A dummy_symbol
|
||||
|
||||
|
||||
DESCRIPTION
|
||||
Many formats cannot represent arbitary symbol information; for
|
||||
instance the <<a.out>> object format does not allow an
|
||||
arbitary number of sections. A symbol pointing to a section
|
||||
@@ -142,148 +132,135 @@ DESCRIPTION
|
||||
*/
|
||||
|
||||
|
||||
/*doc*
|
||||
/*
|
||||
@node typedef asymbol, symbol handling functions, Writing Symbols, Symbols
|
||||
|
||||
*/
|
||||
/*
|
||||
TYPEDEF
|
||||
SUBSECTION
|
||||
typedef asymbol
|
||||
|
||||
DESCRIPTION
|
||||
An <<asymbol>> has the form:
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
CODE_FRAGMENT
|
||||
|
||||
.typedef struct symbol_cache_entry
|
||||
.{
|
||||
A pointer to the BFD which owns the symbol. This information
|
||||
is necessary so that a back end can work out what additional
|
||||
(invisible to the application writer) information is carried
|
||||
with the symbol.
|
||||
|
||||
. {* A pointer to the BFD which owns the symbol. This information
|
||||
. is necessary so that a back end can work out what additional
|
||||
. (invisible to the application writer) information is carried
|
||||
. with the symbol. *}
|
||||
.
|
||||
. struct _bfd *the_bfd;
|
||||
|
||||
The text of the symbol. The name is left alone, and not copied - the
|
||||
application may not alter it.
|
||||
|
||||
. CONST char *name;
|
||||
|
||||
The value of the symbol.
|
||||
|
||||
. symvalue value;
|
||||
|
||||
Attributes of a symbol:
|
||||
|
||||
.
|
||||
. {* The text of the symbol. The name is left alone, and not copied - the
|
||||
. application may not alter it. *}
|
||||
. CONST char *name;
|
||||
.
|
||||
. {* The value of the symbol.*}
|
||||
. symvalue value;
|
||||
.
|
||||
. {* Attributes of a symbol: *}
|
||||
.
|
||||
.#define BSF_NO_FLAGS 0x00
|
||||
|
||||
The symbol has local scope; <<static>> in <<C>>. The value is
|
||||
the offset into the section of the data.
|
||||
|
||||
.
|
||||
. {* The symbol has local scope; <<static>> in <<C>>. The value
|
||||
. is the offset into the section of the data. *}
|
||||
.#define BSF_LOCAL 0x01
|
||||
|
||||
The symbol has global scope; initialized data in <<C>>. The value
|
||||
is the offset into the section of the data.
|
||||
|
||||
.
|
||||
. {* The symbol has global scope; initialized data in <<C>>. The
|
||||
. value is the offset into the section of the data. *}
|
||||
.#define BSF_GLOBAL 0x02
|
||||
|
||||
Obsolete
|
||||
|
||||
.
|
||||
. {* Obsolete *}
|
||||
.#define BSF_IMPORT 0x04
|
||||
|
||||
The symbol has global scope, and is exported. The value is the offset
|
||||
into the section of the data.
|
||||
|
||||
.
|
||||
. {* The symbol has global scope, and is exported. The value is
|
||||
. the offset into the section of the data. *}
|
||||
.#define BSF_EXPORT 0x08
|
||||
|
||||
The symbol is undefined. <<extern>> in <<C>>. The value has no meaning.
|
||||
|
||||
.#define BSF_UNDEFINED 0x10
|
||||
|
||||
The symbol is common, initialized to zero; default in <<C>>. The
|
||||
value is the size of the object in bytes.
|
||||
|
||||
.#define BSF_FORT_COMM 0x20
|
||||
|
||||
A normal <<C>> symbol would be one of:
|
||||
<<BSF_LOCAL>>, <<BSF_FORT_COMM>>, <<BSF_UNDEFINED>> or <<BSF_EXPORT|BSD_GLOBAL>>
|
||||
|
||||
The symbol is a debugging record. The value has an arbitary meaning.
|
||||
|
||||
.
|
||||
. {* The symbol is undefined. <<extern>> in <<C>>. The value has
|
||||
. no meaning. *}
|
||||
.#define BSF_UNDEFINED_OBS 0x10
|
||||
.
|
||||
. {* The symbol is common, initialized to zero; default in
|
||||
. <<C>>. The value is the size of the object in bytes. *}
|
||||
.#define BSF_FORT_COMM_OBS 0x20
|
||||
.
|
||||
. {* A normal C symbol would be one of:
|
||||
. <<BSF_LOCAL>>, <<BSF_FORT_COMM>>, <<BSF_UNDEFINED>> or
|
||||
. <<BSF_EXPORT|BSD_GLOBAL>> *}
|
||||
.
|
||||
. {* The symbol is a debugging record. The value has an arbitary
|
||||
. meaning. *}
|
||||
.#define BSF_DEBUGGING 0x40
|
||||
|
||||
The symbol has no section attached, any value is the actual value and
|
||||
is not a relative offset to a section.
|
||||
|
||||
.#define BSF_ABSOLUTE 0x80
|
||||
|
||||
Used by the linker
|
||||
|
||||
.
|
||||
. {* Used by the linker *}
|
||||
.#define BSF_KEEP 0x10000
|
||||
.#define BSF_KEEP_G 0x80000
|
||||
|
||||
Unused
|
||||
|
||||
.
|
||||
. {* Unused *}
|
||||
.#define BSF_WEAK 0x100000
|
||||
.#define BSF_CTOR 0x200000
|
||||
.#define BSF_FAKE 0x400000
|
||||
|
||||
The symbol used to be a common symbol, but now it is allocated.
|
||||
|
||||
.
|
||||
. {* This symbol was created to point to a section *}
|
||||
.#define BSF_SECTION_SYM 0x400000
|
||||
.
|
||||
. {* The symbol used to be a common symbol, but now it is
|
||||
. allocated. *}
|
||||
.#define BSF_OLD_COMMON 0x800000
|
||||
|
||||
The default value for common data.
|
||||
|
||||
.
|
||||
. {* The default value for common data. *}
|
||||
.#define BFD_FORT_COMM_DEFAULT_VALUE 0
|
||||
|
||||
In some files the type of a symbol sometimes alters its location
|
||||
in an output file - ie in coff a <<ISFCN>> symbol which is also <<C_EXT>>
|
||||
symbol appears where it was declared and not at the end of a section.
|
||||
This bit is set by the target BFD part to convey this information.
|
||||
|
||||
.
|
||||
. {* In some files the type of a symbol sometimes alters its
|
||||
. location in an output file - ie in coff a <<ISFCN>> symbol
|
||||
. which is also <<C_EXT>> symbol appears where it was
|
||||
. declared and not at the end of a section. This bit is set
|
||||
. by the target BFD part to convey this information. *}
|
||||
.
|
||||
.#define BSF_NOT_AT_END 0x40000
|
||||
|
||||
Signal that the symbol is the label of constructor section.
|
||||
|
||||
.
|
||||
. {* Signal that the symbol is the label of constructor section. *}
|
||||
.#define BSF_CONSTRUCTOR 0x1000000
|
||||
|
||||
Signal that the symbol is a warning symbol. If the symbol is a warning
|
||||
symbol, then the value field (I know this is tacky) will point to the
|
||||
asymbol which when referenced will cause the warning.
|
||||
|
||||
.
|
||||
. {* Signal that the symbol is a warning symbol. If the symbol
|
||||
. is a warning symbol, then the value field (I know this is
|
||||
. tacky) will point to the asymbol which when referenced will
|
||||
. cause the warning. *}
|
||||
.#define BSF_WARNING 0x2000000
|
||||
|
||||
Signal that the symbol is indirect. The value of the symbol is a
|
||||
pointer to an undefined asymbol which contains the name to use
|
||||
instead.
|
||||
|
||||
.
|
||||
. {* Signal that the symbol is indirect. The value of the symbol
|
||||
. is a pointer to an undefined asymbol which contains the
|
||||
. name to use instead. *}
|
||||
.#define BSF_INDIRECT 0x4000000
|
||||
|
||||
.
|
||||
. flagword flags;
|
||||
|
||||
A pointer to the section to which this symbol is relative, or 0 if the
|
||||
symbol is absolute or undefined. Note that it is not sufficient to set
|
||||
this location to 0 to mark a symbol as absolute - the flag
|
||||
<<BSF_ABSOLUTE>> must be set also.
|
||||
|
||||
.
|
||||
. {* A pointer to the section to which this symbol is
|
||||
. relative. This will always be non NULL, there are special
|
||||
. sections for undefined and absolute symbols *}
|
||||
. struct sec *section;
|
||||
|
||||
Back end special data. This is being phased out in favour of making
|
||||
this a union.
|
||||
|
||||
.
|
||||
. {* Back end special data. This is being phased out in favour
|
||||
. of making this a union. *}
|
||||
. PTR udata;
|
||||
.
|
||||
.} asymbol;
|
||||
|
||||
*/
|
||||
|
||||
#include "bfd.h"
|
||||
#include "sysdep.h"
|
||||
#include "libbfd.h"
|
||||
#include "stab.gnu.h"
|
||||
#include "aout/stab_gnu.h"
|
||||
|
||||
/*
|
||||
@node symbol handling functions, , typedef asymbol, Symbols
|
||||
SUBSECTION
|
||||
Symbol Handling Functions
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -372,13 +349,11 @@ asymbol *symbol)
|
||||
{
|
||||
fprintf_vma(file, symbol->value);
|
||||
}
|
||||
fprintf(file," %c%c%c%c%c%c%c%c%c%c",
|
||||
fprintf(file," %c%c%c%c%c%c%c%c",
|
||||
(type & BSF_LOCAL) ? 'l':' ',
|
||||
(type & BSF_GLOBAL) ? 'g' : ' ',
|
||||
(type & BSF_IMPORT) ? 'i' : ' ',
|
||||
(type & BSF_EXPORT) ? 'e' : ' ',
|
||||
(type & BSF_UNDEFINED) ? 'u' : ' ',
|
||||
(type & BSF_FORT_COMM) ? 'c' : ' ',
|
||||
(type & BSF_CONSTRUCTOR) ? 'C' : ' ',
|
||||
(type & BSF_WARNING) ? 'W' : ' ',
|
||||
(type & BSF_INDIRECT) ? 'I' : ' ',
|
||||
@@ -421,14 +396,12 @@ asymbol *symbol)
|
||||
{
|
||||
flagword flags = symbol->flags;
|
||||
|
||||
if (flags & BSF_FORT_COMM) return 'C';
|
||||
if (flags & BSF_UNDEFINED) return 'U';
|
||||
if (flags & BSF_ABSOLUTE)
|
||||
return (flags & BSF_GLOBAL) ? 'A' : 'a';
|
||||
if (symbol->section == &bfd_com_section) return 'C';
|
||||
if (symbol->section == &bfd_und_section) return 'U';
|
||||
|
||||
if ( flags & (BSF_GLOBAL|BSF_LOCAL) ) {
|
||||
if (symbol->section == (asection *)NULL)
|
||||
return '*';
|
||||
if ( symbol->section == &bfd_abs_section)
|
||||
return (flags & BSF_GLOBAL) ? 'A' : 'a';
|
||||
else if ( !strcmp(symbol->section->name, ".text") )
|
||||
return (flags & BSF_GLOBAL) ? 'T' : 't';
|
||||
else if ( !strcmp(symbol->section->name, ".data") )
|
||||
@@ -450,3 +423,11 @@ asymbol *symbol)
|
||||
|
||||
return '?';
|
||||
}
|
||||
|
||||
|
||||
bfd_symbol_is_absolute()
|
||||
{
|
||||
|
||||
abort();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user