This is the mail archive of the binutils@sourceware.cygnus.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[rfa] Sign extend elf entry point (sometimes)


Ok?

The attatched sign extens the ELF header entry point when that is the
convention for the target.
GDB gets mighty confused when its entry point is unsigned yet symbol
table values are signed.

	Andrew

(It also replaces the corresponding bfd_get_start_address(xxx)= with a
bfd_set_start_address()).
Fri Jun 23 16:41:25 2000  Andrew Cagney  <cagney@b1.cygnus.com>

	* elfcode.h (elf_object_p): Use bfd_set_start_address and not
 	bfd_get_start_address.
	(elf_swap_ehdr_in): Sign extend e_entry when applicable.
	(elf_swap_ehdr_out): Ditto.

Index: elfcode.h
===================================================================
RCS file: /cvs/cvsfiles/devo/bfd/elfcode.h,v
retrieving revision 1.241
diff -p -r1.241 elfcode.h
*** elfcode.h	2000/04/28 13:37:45	1.241
--- elfcode.h	2000/06/23 06:44:34
***************
*** 1,6 ****
  /* ELF executable support for BFD.
!    Copyright 1991, 92, 93, 94, 95, 96, 97, 98, 1999 Free Software
!    Foundation, Inc.
  
     Written by Fred Fish @ Cygnus Support, from information published
     in "UNIX System V Release 4, Programmers Guide: ANSI C and
--- 1,6 ----
  /* ELF executable support for BFD.
!    Copyright 1991, 92, 93, 94, 95, 96, 97, 98, 1999, 2000 Free
!    Software Foundation, Inc.
  
     Written by Fred Fish @ Cygnus Support, from information published
     in "UNIX System V Release 4, Programmers Guide: ANSI C and
*************** elf_swap_ehdr_in (abfd, src, dst)
*** 246,256 ****
       const Elf_External_Ehdr *src;
       Elf_Internal_Ehdr *dst;
  {
    memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
    dst->e_type = bfd_h_get_16 (abfd, (bfd_byte *) src->e_type);
    dst->e_machine = bfd_h_get_16 (abfd, (bfd_byte *) src->e_machine);
    dst->e_version = bfd_h_get_32 (abfd, (bfd_byte *) src->e_version);
!   dst->e_entry = get_word (abfd, (bfd_byte *) src->e_entry);
    dst->e_phoff = get_word (abfd, (bfd_byte *) src->e_phoff);
    dst->e_shoff = get_word (abfd, (bfd_byte *) src->e_shoff);
    dst->e_flags = bfd_h_get_32 (abfd, (bfd_byte *) src->e_flags);
--- 246,260 ----
       const Elf_External_Ehdr *src;
       Elf_Internal_Ehdr *dst;
  {
+   int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
    memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
    dst->e_type = bfd_h_get_16 (abfd, (bfd_byte *) src->e_type);
    dst->e_machine = bfd_h_get_16 (abfd, (bfd_byte *) src->e_machine);
    dst->e_version = bfd_h_get_32 (abfd, (bfd_byte *) src->e_version);
!   if (signed_vma)
!     dst->e_entry = get_signed_word (abfd, (bfd_byte *) src->e_entry);
!   else
!     dst->e_entry = get_word (abfd, (bfd_byte *) src->e_entry);
    dst->e_phoff = get_word (abfd, (bfd_byte *) src->e_phoff);
    dst->e_shoff = get_word (abfd, (bfd_byte *) src->e_shoff);
    dst->e_flags = bfd_h_get_32 (abfd, (bfd_byte *) src->e_flags);
*************** elf_swap_ehdr_out (abfd, src, dst)
*** 271,282 ****
       const Elf_Internal_Ehdr *src;
       Elf_External_Ehdr *dst;
  {
    memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
    /* note that all elements of dst are *arrays of unsigned char* already... */
    bfd_h_put_16 (abfd, src->e_type, dst->e_type);
    bfd_h_put_16 (abfd, src->e_machine, dst->e_machine);
    bfd_h_put_32 (abfd, src->e_version, dst->e_version);
!   put_word (abfd, src->e_entry, dst->e_entry);
    put_word (abfd, src->e_phoff, dst->e_phoff);
    put_word (abfd, src->e_shoff, dst->e_shoff);
    bfd_h_put_32 (abfd, src->e_flags, dst->e_flags);
--- 275,290 ----
       const Elf_Internal_Ehdr *src;
       Elf_External_Ehdr *dst;
  {
+   int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
    memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
    /* note that all elements of dst are *arrays of unsigned char* already... */
    bfd_h_put_16 (abfd, src->e_type, dst->e_type);
    bfd_h_put_16 (abfd, src->e_machine, dst->e_machine);
    bfd_h_put_32 (abfd, src->e_version, dst->e_version);
!   if (signed_vma)
!     put_signed_word (abfd, src->e_entry, dst->e_entry);
!   else
!     put_word (abfd, src->e_entry, dst->e_entry);
    put_word (abfd, src->e_phoff, dst->e_phoff);
    put_word (abfd, src->e_shoff, dst->e_shoff);
    bfd_h_put_32 (abfd, src->e_flags, dst->e_flags);
*************** elf_object_p (abfd)
*** 613,619 ****
      }
  
    /* Remember the entry point specified in the ELF file header. */
!   bfd_get_start_address (abfd) = i_ehdrp->e_entry;
  
    /* Allocate space for a copy of the section header table in
       internal form, seek to the section header table in the file,
--- 621,627 ----
      }
  
    /* Remember the entry point specified in the ELF file header. */
!   bfd_set_start_address (abfd, i_ehdrp->e_entry);
  
    /* Allocate space for a copy of the section header table in
       internal form, seek to the section header table in the file,

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]