* configure.in: Added new option --with[out]-mmap. Set USE_MMAP if it is given

and mmep is available.
* acconfig.h: Undef USE_MMAP.
* configure, config.in: Regenerated.
* aoutx.h: If USE_MMAP is not defined, do all symbol and string table handling
the old way.
(aout_get_external_symbols): Don't complain if last byte of string table is
nonzero.
* libbfd.c [HAVE_MADVISE]: Include sys/types.h and sys/mman.h.
(bfd_free_window) [! USE_MMAP]: Don't define.
(bfd_get_file_window, _bfd_generic_get_section_contents_in_window)
 [! USE_MMAP]: Abort.
This commit is contained in:
Ken Raeburn 1995-11-09 09:14:01 +00:00
parent 653b07da0c
commit 7ac847361b
3 changed files with 80 additions and 13 deletions

View File

@ -1,3 +1,18 @@
Thu Nov 9 04:00:38 1995 Ken Raeburn <raeburn@cygnus.com>
* configure.in: Added new option --with[out]-mmap. Set USE_MMAP
if it is given and mmep is available.
* acconfig.h: Undef USE_MMAP.
* configure, config.in: Regenerated.
* aoutx.h: If USE_MMAP is not defined, do all symbol and string
table handling the old way.
(aout_get_external_symbols): Don't complain if last byte of string
table is nonzero.
* libbfd.c [HAVE_MADVISE]: Include sys/types.h and sys/mman.h.
(bfd_free_window) [! USE_MMAP]: Don't define.
(bfd_get_file_window,
_bfd_generic_get_section_contents_in_window) [! USE_MMAP]: Abort.
Wed Nov 8 20:03:44 1995 Eric Freudenthal <freudenthal@nyu.edu>
* coff-a29k.c (SIGN_EXTEND_HWORD): Use ~0xffff rather than

View File

@ -12,3 +12,6 @@
/* Define only if <sys/procfs.h> is available *and* it defines prstatus_t. */
#undef HAVE_SYS_PROCFS_H
/* Do we really want to use mmap if it's available? */
#undef USE_MMAP

View File

@ -496,10 +496,12 @@ NAME(aout,some_aout_object_p) (abfd, execp, callback_to_real_object_p)
/* The default symbol entry size is that of traditional Unix. */
obj_symbol_entry_size (abfd) = EXTERNAL_NLIST_SIZE;
obj_aout_external_syms (abfd) = NULL;
#ifdef USE_MMAP
bfd_init_window (&obj_aout_sym_window (abfd));
obj_aout_external_strings (abfd) = NULL;
bfd_init_window (&obj_aout_string_window (abfd));
#endif
obj_aout_external_syms (abfd) = NULL;
obj_aout_external_strings (abfd) = NULL;
obj_aout_sym_hashes (abfd) = NULL;
if (! NAME(aout,make_sections) (abfd))
@ -1228,11 +1230,32 @@ aout_get_external_symbols (abfd)
count = exec_hdr (abfd)->a_syms / EXTERNAL_NLIST_SIZE;
#ifdef USE_MMAP
if (bfd_get_file_window (abfd,
obj_sym_filepos (abfd), exec_hdr (abfd)->a_syms,
&obj_aout_sym_window (abfd), true) == false)
return false;
syms = (struct external_nlist *) obj_aout_sym_window (abfd).data;
#else
/* We allocate using malloc to make the values easy to free
later on. If we put them on the obstack it might not be
possible to free them. */
syms = ((struct external_nlist *)
malloc ((size_t) count * EXTERNAL_NLIST_SIZE));
if (syms == (struct external_nlist *) NULL && count != 0)
{
bfd_set_error (bfd_error_no_memory);
return false;
}
if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
|| (bfd_read (syms, 1, exec_hdr (abfd)->a_syms, abfd)
!= exec_hdr (abfd)->a_syms))
{
free (syms);
return false;
}
#endif
obj_aout_external_syms (abfd) = syms;
obj_aout_external_sym_count (abfd) = count;
@ -1252,25 +1275,34 @@ aout_get_external_symbols (abfd)
return false;
stringsize = GET_WORD (abfd, string_chars);
#ifdef USE_MMAP
if (bfd_get_file_window (abfd, obj_str_filepos (abfd), stringsize,
&obj_aout_string_window (abfd), true) == false)
return false;
strings = (char *) obj_aout_string_window (abfd).data;
#else
strings = (char *) malloc ((size_t) stringsize + 1);
if (strings == NULL)
{
bfd_set_error (bfd_error_no_memory);
return false;
}
/* Skip space for the string count in the buffer for convenience
when using indexes. */
if (bfd_read (strings + BYTES_IN_WORD, 1, stringsize - BYTES_IN_WORD,
abfd)
!= stringsize - BYTES_IN_WORD)
{
free (strings);
return false;
}
#endif
/* Ensure that a zero index yields an empty string. */
strings[0] = '\0';
/* Using the "window" interface, we don't know that there's
writeable storage after the last byte of the string table.
Besides, every string in the string table should be null
terminated. Check it here so the application doesn't crash,
but don't expend huge effort trying to correct a broken
object file. */
if (stringsize > BYTES_IN_WORD && strings[stringsize - 1] != 0)
{
fprintf (stderr, "string table missing ending null\n");
strings[stringsize - 1] = 0;
}
strings[stringsize - 1] = 0;
obj_aout_external_strings (abfd) = strings;
obj_aout_external_string_size (abfd) = stringsize;
@ -1741,7 +1773,11 @@ NAME(aout,slurp_symbol_table) (abfd)
if (old_external_syms == (struct external_nlist *) NULL
&& obj_aout_external_syms (abfd) != (struct external_nlist *) NULL)
{
#ifdef USE_MMAP
bfd_free_window (&obj_aout_sym_window (abfd));
#else
free (obj_aout_external_syms (abfd));
#endif
obj_aout_external_syms (abfd) = NULL;
}
@ -2770,10 +2806,15 @@ NAME(aout,bfd_free_cached_info) (abfd)
#define BFCI_FREE(x) if (x != NULL) { free (x); x = NULL; }
BFCI_FREE (obj_aout_symbols (abfd));
#ifdef USE_MMAP
obj_aout_external_syms (abfd) = 0;
bfd_free_window (&obj_aout_sym_window (abfd));
bfd_free_window (&obj_aout_string_window (abfd));
obj_aout_external_strings (abfd) = 0;
#else
BFCI_FREE (obj_aout_external_syms (abfd));
BFCI_FREE (obj_aout_external_strings (abfd));
#endif
for (o = abfd->sections; o != (asection *) NULL; o = o->next)
BFCI_FREE (o->relocation);
#undef BFCI_FREE
@ -2945,12 +2986,20 @@ aout_link_free_symbols (abfd)
{
if (obj_aout_external_syms (abfd) != (struct external_nlist *) NULL)
{
#ifdef USE_MMAP
bfd_free_window (&obj_aout_sym_window (abfd));
#else
free ((PTR) obj_aout_external_syms (abfd));
#endif
obj_aout_external_syms (abfd) = (struct external_nlist *) NULL;
}
if (obj_aout_external_strings (abfd) != (char *) NULL)
{
#ifdef USE_MMAP
bfd_free_window (&obj_aout_string_window (abfd));
#else
free ((PTR) obj_aout_external_strings (abfd));
#endif
obj_aout_external_strings (abfd) = (char *) NULL;
}
return true;