aboutsummaryrefslogtreecommitdiff
path: root/ld/ldfile.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1994-05-19 18:25:10 +0000
committerIan Lance Taylor <ian@airs.com>1994-05-19 18:25:10 +0000
commit2a9fa50cd8ae5dc1e99056c9683bece549e0b68f (patch)
treed4a3dce560b126bc852e1b8cd1dabaa266b7ba2d /ld/ldfile.c
parent013dec1ad95ef067951314b9f1beb2fa53296a6f (diff)
downloadgdb-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/ldfile.c')
-rw-r--r--ld/ldfile.c54
1 files changed, 28 insertions, 26 deletions
diff --git a/ld/ldfile.c b/ld/ldfile.c
index 6bcca03..43e9575 100644
--- a/ld/ldfile.c
+++ b/ld/ldfile.c
@@ -1,5 +1,4 @@
-
-/* Copyright (C) 1991 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 94 Free Software Foundation, Inc.
This file is part of GLD, the Gnu Linker.
@@ -32,6 +31,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "ldlang.h"
#include "ldfile.h"
#include "ldmain.h"
+#include "ldgram.h"
#include "ldlex.h"
#include <ctype.h>
@@ -89,7 +89,7 @@ ldfile_add_library_path(name)
char *name;
{
search_dirs_type *new =
- (search_dirs_type *)ldmalloc((bfd_size_type)(sizeof(search_dirs_type)));
+ (search_dirs_type *)xmalloc((bfd_size_type)(sizeof(search_dirs_type)));
new->name = name;
new->next = (search_dirs_type*)NULL;
*search_tail_ptr = new;
@@ -160,41 +160,42 @@ open_a(arch, entry, lib, suffix)
void
ldfile_open_file (entry)
-lang_input_statement_type *entry;
+ lang_input_statement_type *entry;
{
-
- if (entry->superfile)
+ if (entry->superfile != NULL)
ldfile_open_file (entry->superfile);
- if (entry->search_dirs_flag)
+ if (! entry->search_dirs_flag)
+ entry->the_bfd = cached_bfd_openr (entry->filename, entry);
+ else
{
search_arch_type *arch;
+
/* Try to open <filename><suffix> or lib<filename><suffix>.a */
-
for (arch = search_arch_head;
- arch != (search_arch_type *)NULL;
- arch = arch->next) {
- if (open_a(arch->name,entry,"lib",".a") != (bfd *)NULL) {
- return;
- }
+ arch != (search_arch_type *) NULL;
+ arch = arch->next)
+ {
+ if (config.dynamic_link)
+ {
+ /* FIXME: Perhaps we will sometimes want something other
+ than .so. */
+ if (open_a (arch->name, entry, "lib", ".so") != (bfd *) NULL)
+ return;
+ }
+ if (open_a (arch->name, entry, "lib", ".a") != (bfd *) NULL)
+ return;
#ifdef VMS
- if (open_a(arch->name,entry,":lib",".a") != (bfd *)NULL) {
- return;
- }
+ if (open_a (arch->name, entry, ":lib", ".a") != (bfd *) NULL)
+ return;
#endif
-
- }
-
+ }
}
- else {
- entry->the_bfd = cached_bfd_openr (entry->filename, entry);
- }
- if (!entry->the_bfd)
+ if (entry->the_bfd == NULL)
einfo("%F%P: cannot open %s: %E\n", entry->local_sym_name);
}
-
/* Try to open NAME; if that fails, try NAME with EXTEN appended to it. */
static FILE *
@@ -264,6 +265,7 @@ char *name;
ldlex_input_stack = ldfile_find_command_file(name, "");
if (ldlex_input_stack == (FILE *)NULL) {
+ bfd_set_error (bfd_error_system_call);
einfo("%P%F: cannot open linker script file %s: %E\n",name);
}
lex_push_file(ldlex_input_stack, name);
@@ -316,7 +318,7 @@ ldfile_add_arch(name)
char *name;
{
search_arch_type *new =
- (search_arch_type *)ldmalloc((bfd_size_type)(sizeof(search_arch_type)));
+ (search_arch_type *)xmalloc((bfd_size_type)(sizeof(search_arch_type)));
if (*name != '\0') {
@@ -343,7 +345,7 @@ ldfile_add_arch (in_name)
{
char *name = buystring(in_name);
search_arch_type *new =
- (search_arch_type *)ldmalloc((bfd_size_type)(sizeof(search_arch_type)));
+ (search_arch_type *)xmalloc((bfd_size_type)(sizeof(search_arch_type)));
ldfile_output_machine_name = in_name;