diff options
author | Ian Lance Taylor <ian@airs.com> | 1994-05-19 18:25:10 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1994-05-19 18:25:10 +0000 |
commit | 2a9fa50cd8ae5dc1e99056c9683bece549e0b68f (patch) | |
tree | d4a3dce560b126bc852e1b8cd1dabaa266b7ba2d /ld/ld.h | |
parent | 013dec1ad95ef067951314b9f1beb2fa53296a6f (diff) | |
download | gdb-2a9fa50cd8ae5dc1e99056c9683bece549e0b68f.zip gdb-2a9fa50cd8ae5dc1e99056c9683bece549e0b68f.tar.gz gdb-2a9fa50cd8ae5dc1e99056c9683bece549e0b68f.tar.bz2 |
Add support for ELF shared libraries.
* ld.h (ld_config_type): Add field dynamic_link.
* ldmain.c (main): Initialize config.dynamic_link to false. Warn
on attempts to use -r with -relax, -call_shared or -s.
* lexsup.c (longopts): Separate OPTION_CALL_SHARED from
OPTION_NON_SHARED. Add OPTION_IGNORE. Adjust macro values
accordingly. Add "dy" and "non_shared" options. Change "Qy" to
OPTION_IGNORE for now. Handle OPTION_CALL_SHARED and
OPTION_NON_SHARED by setting dynamic_link field accordingly.
Handle OPTION_IGNORE by ignoring it. Clear dynamic_link field for
-r and -Ur.
* ldfile.c (ldfile_open_file): If config.dynamic_link is true, try
opening a file with a .so extension first.
* emultempl/elf32.em: New file.
* emulparams/elf32_sparc.sh (TEXT_START_ADDR): Change to 0x10000.
(NONPAGED_TEXT_START_ADDR): Likewise.
(TEMPLATE_NAME): Define as elf32.
(DATA_PLT): Define.
* emulparams/elf_i386.sh (TEMPLATE_NAME): Define as elf32.
* scripttempl/elf.sc: Add placement for new dynamic sections.
Don't use CREATE_OBJECT_SYMBOLS. Define _etext, _edata and _end
outside of any section. Don't use ALIGN(8); just let one section
VMA follow another. Put .dynbss in .bss. Don't mention debugging
sections; they'll be handled correctly anyhow.
* Makefile.in (eelf_i386.c): Depend upon elf32.em, not generic.em.
Diffstat (limited to 'ld/ld.h')
-rw-r--r-- | ld/ld.h | 85 |
1 files changed, 28 insertions, 57 deletions
@@ -18,66 +18,41 @@ along with GLD; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ +#ifndef LD_H +#define LD_H -#define flag_is_not_at_end(x) ((x) & BSF_NOT_AT_END) -#define flag_is_ordinary_local(x) (((x) & (BSF_LOCAL))&!((x) & (BSF_DEBUGGING))) -#define flag_is_debugger(x) ((x) & BSF_DEBUGGING) -#define flag_is_undefined_or_global(x) ((x) & (BSF_UNDEFINED | BSF_GLOBAL)) -#define flag_is_defined(x) (!((x) & (BSF_UNDEFINED))) -#define flag_is_global_or_common(x) ((x) & (BSF_GLOBAL | BSF_FORT_COMM)) -#define flag_is_undefined_or_global_or_common(x) ((x) & (BSF_UNDEFINED | BSF_GLOBAL | BSF_FORT_COMM)) -#define flag_is_undefined_or_global_or_common_or_constructor(x) ((x) & (BSF_UNDEFINED | BSF_GLOBAL | BSF_FORT_COMM | BSF_CONSTRUCTOR)) -#define flag_is_constructor(x) ((x) & BSF_CONSTRUCTOR) -#define flag_is_common(x) ((x) & BSF_FORT_COMM) -#define flag_is_global(x) ((x) & (BSF_GLOBAL)) -#define flag_is_weak(x) ((x) & BSF_WEAK) -#define flag_is_undefined(x) ((x) & BSF_UNDEFINED) -#define flag_set(x,y) (x = y) -#define flag_is_fort_comm(x) ((x) & BSF_FORT_COMM) -#define flag_is_absolute(x) ((x) & BSF_ABSOLUTE) /* Extra information we hold on sections */ -typedef struct user_section_struct { +typedef struct user_section_struct +{ /* Pointer to the section where this data will go */ struct lang_input_statement_struct *file; } section_userdata_type; #define get_userdata(x) ((x)->userdata) -#define as_output_section_statement(x) ((x)->otheruserdata) - - - -/* Which symbols should be stripped (omitted from the output): - none, all, or debugger symbols. */ -typedef enum { STRIP_NONE, STRIP_ALL, STRIP_DEBUGGER, STRIP_SOME } strip_symbols_type; - - - - -/* Which local symbols should be omitted: - none, all, or those starting with L. - This is irrelevant if STRIP_NONE. */ -typedef enum { DISCARD_NONE, DISCARD_ALL, DISCARD_L } discard_locals_type; - #define BYTE_SIZE (1) #define SHORT_SIZE (2) #define LONG_SIZE (4) +#define QUAD_SIZE (8) /* ALIGN macro changed to ALIGN_N to avoid */ /* conflict in /usr/include/machine/machparam.h */ -/* WARNING: If THIS is a 64 bit address and BOUNDARY is an unsigned int, +/* WARNING: If THIS is a 64 bit address and BOUNDARY is a 32 bit int, you must coerce boundary to the same type as THIS. ??? Is there a portable way to avoid this. */ -#define ALIGN_N(this, boundary) ((( (this) + ((boundary) -1)) & (~((boundary)-1)))) +#define ALIGN_N(this, boundary) \ + ((( (this) + ((boundary) -1)) & (~((boundary)-1)))) -typedef struct { +typedef struct +{ /* 1 => assign space to common symbols even if `relocatable_output'. */ boolean force_common_definition; boolean relax; - } args_type; +extern args_type command_line; + typedef int token_code_type; typedef struct @@ -85,41 +60,37 @@ typedef struct bfd_size_type specified_data_size; boolean magic_demand_paged; boolean make_executable; - /* 1 => write relocation into output file so can re-input it later. */ - boolean relocateable_output; - /* Will we build contstructors, or leave alone ? */ + /* If true, doing a dynamic link. */ + boolean dynamic_link; + boolean build_constructors; /* If true, warn about merging common symbols with others. */ boolean warn_common; boolean sort_common; -/* these flags may seem mutually exclusive, but not setting them - allows the back end to decide what would be the best thing to do */ + boolean text_read_only; - char *map_filename; - FILE *map_file; + char *map_filename; + FILE *map_file; + boolean stats; } ld_config_type; -#define set_asymbol_chain(x,y) ((x)->udata = (PTR)y) -#define get_asymbol_chain(x) ((asymbol **)((x)->udata)) -#define get_loader_symbol(x) ((loader_global_asymbol *)((x)->udata)) -#define set_loader_symbol(x,y) ((x)->udata = (PTR)y) - - +extern ld_config_type config; - - -typedef enum { +typedef enum +{ lang_first_phase_enum, lang_allocating_phase_enum, - lang_final_phase_enum } lang_phase_type; - - + lang_final_phase_enum +} lang_phase_type; +extern boolean had_script; +extern boolean force_make_executable; +extern int yyparse PARAMS ((void)); -int yyparse(); +#endif |