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]

PATCH octets vs bytes for objdump


This patch implements non-octet-sized bytes functionality for objdump.

  * include/dis-asm.h (struct disassemble_info): Added octets_per_byte
field and initialize it to one (1)
  * opcodes/dis-buf.c (buffer_read_memory):  Use octets_per_byte field
to adjust target address bounds checking and calculate the appropriate
octet offset into data
  * binutils/objdump.c (dump_section_header, find_symbol_for_address,
show_line, disassemble_bytes, disassemble_data, dump_data): distinguish
between octets and bytes.


Index: include/dis-asm.h
===================================================================
RCS file: /cvs/binutils/binutils/include/dis-asm.h,v
retrieving revision 1.4
diff -c -3 -p -r1.4 dis-asm.h
*** dis-asm.h	1999/12/16 01:23:39	1.4
--- dis-asm.h	2000/01/26 12:18:20
*************** typedef struct disassemble_info {
*** 121,126 ****
--- 121,131 ----
    int bytes_per_chunk;
    enum bfd_endian display_endian;
  
+   /* Number of octets per incremented target address 
+      Normally one, but some DSPs have byte sizes of 16 or 32 bits
+    */
+   int octets_per_byte;
+ 
    /* Results from instruction decoders.  Not all decoders yet support
       this information.  This info is set each time an instruction is
       decoded, and is only valid for the last such instruction.
*************** extern int generic_symbol_at_address
*** 225,230 ****
--- 230,236 ----
    (INFO).arch = bfd_arch_unknown, \
    (INFO).mach = 0, \
    (INFO).endian = BFD_ENDIAN_UNKNOWN, \
+   (INFO).octets_per_byte = 1, \
    INIT_DISASSEMBLE_INFO_NO_ARCH(INFO, STREAM, FPRINTF_FUNC)
  
  /* Call this macro to initialize only the internal variables for the
Index: opcodes/dis-buf.c
===================================================================
RCS file: /cvs/binutils/binutils/opcodes/dis-buf.c,v
retrieving revision 1.3
diff -c -3 -p -r1.3 dis-buf.c
*** dis-buf.c	1999/08/10 15:02:41	1.3
--- dis-buf.c	2000/01/26 12:18:20
*************** buffer_read_memory (memaddr, myaddr, len
*** 29,39 ****
       int length;
       struct disassemble_info *info;
  {
    if (memaddr < info->buffer_vma
!       || memaddr - info->buffer_vma + length > info->buffer_length)
      /* Out of bounds.  Use EIO because GDB uses it.  */
      return EIO;
!   memcpy (myaddr, info->buffer + (memaddr - info->buffer_vma), length);
    return 0;
  }
  
--- 29,45 ----
       int length;
       struct disassemble_info *info;
  {
+   int opb = info->octets_per_byte;
+   int end_addr_offset = length / opb;
+   int max_addr_offset = info->buffer_length / opb; 
+   int octets = (memaddr - info->buffer_vma) * opb;
+ 
    if (memaddr < info->buffer_vma
!       || memaddr + end_addr_offset > info->buffer_vma + max_addr_offset)
      /* Out of bounds.  Use EIO because GDB uses it.  */
      return EIO;
!   memcpy (myaddr, info->buffer + octets, length);
! 
    return 0;
  }
  
Index: binutils/objdump.c
===================================================================
RCS file: /cvs/binutils/binutils/binutils/objdump.c,v
retrieving revision 1.14
diff -c -3 -p -r1.14 objdump.c
*** objdump.c	1999/11/21 11:37:21	1.14
--- objdump.c	2000/01/26 12:18:22
*************** dump_section_header (abfd, section, igno
*** 335,344 ****
       PTR ignored ATTRIBUTE_UNUSED;
  {
    char *comma = "";
  
    printf ("%3d %-13s %08lx  ", section->index,
  	  bfd_get_section_name (abfd, section),
! 	  (unsigned long) bfd_section_size (abfd, section));
    printf_vma (bfd_get_section_vma (abfd, section));
    printf ("  ");
    printf_vma (section->lma);
--- 335,345 ----
       PTR ignored ATTRIBUTE_UNUSED;
  {
    char *comma = "";
+   int opb = bfd_octets_per_byte(abfd);
  
    printf ("%3d %-13s %08lx  ", section->index,
  	  bfd_get_section_name (abfd, section),
! 	  (unsigned long) bfd_section_size (abfd, section) / opb);
    printf_vma (bfd_get_section_vma (abfd, section));
    printf ("  ");
    printf_vma (section->lma);
*************** find_symbol_for_address (abfd, sec, vma,
*** 737,742 ****
--- 738,744 ----
    long min = 0;
    long max = sorted_symcount;
    long thisplace;
+   int opb = bfd_octets_per_byte(abfd); 
  
    if (sorted_symcount < 1)
      return NULL;
*************** find_symbol_for_address (abfd, sec, vma,
*** 784,790 ****
  	  || ((abfd->flags & HAS_RELOC) != 0
  	      && vma >= bfd_get_section_vma (abfd, sec)
  	      && vma < (bfd_get_section_vma (abfd, sec)
! 			+ bfd_section_size (abfd, sec)))))
      {
        long i;
  
--- 786,792 ----
  	  || ((abfd->flags & HAS_RELOC) != 0
  	      && vma >= bfd_get_section_vma (abfd, sec)
  	      && vma < (bfd_get_section_vma (abfd, sec)
! 			+ bfd_section_size (abfd, sec) / opb))))
      {
        long i;
  
*************** skip_to_line (p, line, show)
*** 1008,1017 ****
     listing.  */
  
  static void
! show_line (abfd, section, off)
       bfd *abfd;
       asection *section;
!      bfd_vma off;
  {
    CONST char *filename;
    CONST char *functionname;
--- 1010,1019 ----
     listing.  */
  
  static void
! show_line (abfd, section, addr_offset)
       bfd *abfd;
       asection *section;
!      bfd_vma addr_offset;
  {
    CONST char *filename;
    CONST char *functionname;
*************** show_line (abfd, section, off)
*** 1020,1026 ****
    if (! with_line_numbers && ! with_source_code)
      return;
  
!   if (! bfd_find_nearest_line (abfd, section, syms, off, &filename,
  			       &functionname, &line))
      return;
  
--- 1022,1028 ----
    if (! with_line_numbers && ! with_source_code)
      return;
  
!   if (! bfd_find_nearest_line (abfd, section, syms, addr_offset, &filename,
  			       &functionname, &line))
      return;
  
*************** objdump_sprintf (va_alist)
*** 1229,1259 ****
  /* Disassemble some data in memory between given values.  */
  
  static void
! disassemble_bytes (info, disassemble_fn, insns, data, start, stop, relppp,
  		   relppend)
       struct disassemble_info *info;
       disassembler_ftype disassemble_fn;
       boolean insns;
       bfd_byte *data;
!      bfd_vma start;
!      bfd_vma stop;
       arelent ***relppp;
       arelent **relppend;
  {
    struct objdump_disasm_info *aux;
    asection *section;
!   int bytes_per_line;
    boolean done_dot;
    int skip_addr_chars;
!   bfd_vma i;
  
    aux = (struct objdump_disasm_info *) info->application_data;
    section = aux->sec;
  
    if (insns)
!     bytes_per_line = 4;
    else
!     bytes_per_line = 16;
  
    /* Figure out how many characters to skip at the start of an
       address, to make the disassembly look nicer.  We discard leading
--- 1231,1263 ----
  /* Disassemble some data in memory between given values.  */
  
  static void
! disassemble_bytes (info, disassemble_fn, insns, data, 
!                    start_offset, stop_offset, relppp,
  		   relppend)
       struct disassemble_info *info;
       disassembler_ftype disassemble_fn;
       boolean insns;
       bfd_byte *data;
!      bfd_vma start_offset;
!      bfd_vma stop_offset;
       arelent ***relppp;
       arelent **relppend;
  {
    struct objdump_disasm_info *aux;
    asection *section;
!   int octets_per_line;
    boolean done_dot;
    int skip_addr_chars;
!   bfd_vma addr_offset;
!   int opb = info->octets_per_byte;
  
    aux = (struct objdump_disasm_info *) info->application_data;
    section = aux->sec;
  
    if (insns)
!     octets_per_line = 4;
    else
!     octets_per_line = 16;
  
    /* Figure out how many characters to skip at the start of an
       address, to make the disassembly look nicer.  We discard leading
*************** disassemble_bytes (info, disassemble_fn,
*** 1265,1272 ****
        char buf[30];
        char *s;
  
!       sprintf_vma (buf,
! 		   section->vma + bfd_section_size (section->owner, section));
        s = buf;
        while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0'
  	     && s[4] == '0')
--- 1269,1276 ----
        char buf[30];
        char *s;
  
!       sprintf_vma (buf, section->vma + 
!                    bfd_section_size (section->owner, section) / opb);
        s = buf;
        while (s[0] == '0' && s[1] == '0' && s[2] == '0' && s[3] == '0'
  	     && s[4] == '0')
*************** disassemble_bytes (info, disassemble_fn,
*** 1279,1312 ****
    info->insn_info_valid = 0;
  
    done_dot = false;
!   i = start;
!   while (i < stop)
      {
        bfd_vma z;
!       int bytes = 0;
        boolean need_nl = false;
  
!       /* If we see more than SKIP_ZEROES bytes of zeroes, we just
           print `...'.  */
!       for (z = i; z < stop; z++)
  	if (data[z] != 0)
  	  break;
        if (! disassemble_zeroes
  	  && (info->insn_info_valid == 0
  	      || info->branch_delay_insns == 0)
! 	  && (z - i >= SKIP_ZEROES
! 	      || (z == stop && z - i < SKIP_ZEROES_AT_END)))
  	{
  	  printf ("\t...\n");
  
! 	  /* If there are more nonzero bytes to follow, we only skip
               zeroes in multiples of 4, to try to avoid running over
               the start of an instruction which happens to start with
               zero.  */
! 	  if (z != stop)
! 	    z = i + ((z - i) &~ 3);
  
! 	  bytes = z - i;
  	}
        else
  	{
--- 1283,1317 ----
    info->insn_info_valid = 0;
  
    done_dot = false;
!   addr_offset = start_offset;
!   while (addr_offset < stop_offset)
      {
        bfd_vma z;
!       int octets = 0;
        boolean need_nl = false;
  
!       /* If we see more than SKIP_ZEROES octets of zeroes, we just
           print `...'.  */
!       for (z = addr_offset * opb; z < stop_offset * opb; z++)
  	if (data[z] != 0)
  	  break;
        if (! disassemble_zeroes
  	  && (info->insn_info_valid == 0
  	      || info->branch_delay_insns == 0)
! 	  && (z - addr_offset * opb >= SKIP_ZEROES
! 	      || (z == stop_offset * opb && 
!                   z - addr_offset * opb < SKIP_ZEROES_AT_END)))
  	{
  	  printf ("\t...\n");
  
! 	  /* If there are more nonzero octets to follow, we only skip
               zeroes in multiples of 4, to try to avoid running over
               the start of an instruction which happens to start with
               zero.  */
! 	  if (z != stop_offset * opb)
! 	    z = addr_offset * opb + ((z - addr_offset * opb) &~ 3);
  
! 	  octets = z - addr_offset * opb;
  	}
        else
  	{
*************** disassemble_bytes (info, disassemble_fn,
*** 1318,1330 ****
  	  done_dot = false;
  
  	  if (with_line_numbers || with_source_code)
! 	    show_line (aux->abfd, section, i);
  
  	  if (! prefix_addresses)
  	    {
  	      char *s;
  
! 	      sprintf_vma (buf, section->vma + i);
  	      for (s = buf + skip_addr_chars; *s == '0'; s++)
  		*s = ' ';
  	      if (*s == '\0')
--- 1323,1335 ----
  	  done_dot = false;
  
  	  if (with_line_numbers || with_source_code)
! 	    show_line (aux->abfd, section, addr_offset);
  
  	  if (! prefix_addresses)
  	    {
  	      char *s;
  
! 	      sprintf_vma (buf, section->vma + addr_offset);
  	      for (s = buf + skip_addr_chars; *s == '0'; s++)
  		*s = ' ';
  	      if (*s == '\0')
*************** disassemble_bytes (info, disassemble_fn,
*** 1334,1340 ****
  	  else
  	    {
  	      aux->require_sec = true;
! 	      objdump_print_address (section->vma + i, info);
  	      aux->require_sec = false;
  	      putchar (' ');
  	    }
--- 1339,1345 ----
  	  else
  	    {
  	      aux->require_sec = true;
! 	      objdump_print_address (section->vma + addr_offset, info);
  	      aux->require_sec = false;
  	      putchar (' ');
  	    }
*************** disassemble_bytes (info, disassemble_fn,
*** 1349,1369 ****
  	      info->bytes_per_line = 0;
  	      info->bytes_per_chunk = 0;
  
! 	      /* FIXME: This is wrong.  It tests the number of bytes
                   in the last instruction, not the current one.  */
  	      if (*relppp < relppend
! 		  && (**relppp)->address >= i
! 		  && (**relppp)->address < i + bytes)
  		info->flags = INSN_HAS_RELOC;
  	      else
  		info->flags = 0;
  
! 	      bytes = (*disassemble_fn) (section->vma + i, info);
  	      info->fprintf_func = (fprintf_ftype) fprintf;
  	      info->stream = stdout;
  	      if (info->bytes_per_line != 0)
! 		bytes_per_line = info->bytes_per_line;
! 	      if (bytes < 0)
  		{
  		  if (sfile.current != sfile.buffer)
  		    printf ("%s\n", sfile.buffer);
--- 1354,1374 ----
  	      info->bytes_per_line = 0;
  	      info->bytes_per_chunk = 0;
  
! 	      /* FIXME: This is wrong.  It tests the number of octets
                   in the last instruction, not the current one.  */
  	      if (*relppp < relppend
! 		  && (**relppp)->address >= addr_offset
! 		  && (**relppp)->address < addr_offset + octets / opb)
  		info->flags = INSN_HAS_RELOC;
  	      else
  		info->flags = 0;
  
! 	      octets = (*disassemble_fn) (section->vma + addr_offset, info);
  	      info->fprintf_func = (fprintf_ftype) fprintf;
  	      info->stream = stdout;
  	      if (info->bytes_per_line != 0)
! 		octets_per_line = info->bytes_per_line;
! 	      if (octets < 0)
  		{
  		  if (sfile.current != sfile.buffer)
  		    printf ("%s\n", sfile.buffer);
*************** disassemble_bytes (info, disassemble_fn,
*** 1375,1392 ****
  	    {
  	      bfd_vma j;
  
! 	      bytes = bytes_per_line;
! 	      if (i + bytes > stop)
! 		bytes = stop - i;
  
! 	      for (j = i; j < i + bytes; ++j)
  		{
  		  if (isprint (data[j]))
! 		    buf[j - i] = data[j];
  		  else
! 		    buf[j - i] = '.';
  		}
! 	      buf[j - i] = '\0';
  	    }
  
  	  if (prefix_addresses
--- 1380,1397 ----
  	    {
  	      bfd_vma j;
  
! 	      octets = octets_per_line;
! 	      if (addr_offset + octets / opb > stop_offset)
! 		octets = (stop_offset - addr_offset) * opb;
  
! 	      for (j = addr_offset * opb; j < addr_offset * opb + octets; ++j)
  		{
  		  if (isprint (data[j]))
! 		    buf[j - addr_offset * opb] = data[j];
  		  else
! 		    buf[j - addr_offset * opb] = '.';
  		}
! 	      buf[j - addr_offset * opb] = '\0';
  	    }
  
  	  if (prefix_addresses
*************** disassemble_bytes (info, disassemble_fn,
*** 1396,1412 ****
  	      bfd_vma j;
  
  	      /* If ! prefix_addresses and ! wide_output, we print
!                  bytes_per_line bytes per line.  */
! 	      pb = bytes;
! 	      if (pb > bytes_per_line && ! prefix_addresses && ! wide_output)
! 		pb = bytes_per_line;
  
  	      if (info->bytes_per_chunk)
  		bpc = info->bytes_per_chunk;
  	      else
  		bpc = 1;
  
! 	      for (j = i; j < i + pb; j += bpc)
  		{
  		  int k;
  		  if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
--- 1401,1417 ----
  	      bfd_vma j;
  
  	      /* If ! prefix_addresses and ! wide_output, we print
!                  octets_per_line octets per line.  */
! 	      pb = octets;
! 	      if (pb > octets_per_line && ! prefix_addresses && ! wide_output)
! 		pb = octets_per_line;
  
  	      if (info->bytes_per_chunk)
  		bpc = info->bytes_per_chunk;
  	      else
  		bpc = 1;
  
! 	      for (j = addr_offset * opb; j < addr_offset * opb + pb; j += bpc)
  		{
  		  int k;
  		  if (bpc > 1 && info->display_endian == BFD_ENDIAN_LITTLE)
*************** disassemble_bytes (info, disassemble_fn,
*** 1423,1429 ****
  		    }
  		}
  
! 	      for (; pb < bytes_per_line; pb += bpc)
  		{
  		  int k;
  
--- 1428,1434 ----
  		    }
  		}
  
! 	      for (; pb < octets_per_line; pb += bpc)
  		{
  		  int k;
  
*************** disassemble_bytes (info, disassemble_fn,
*** 1451,1475 ****
  	      ? show_raw_insn > 0
  	      : show_raw_insn >= 0)
  	    {
! 	      while (pb < bytes)
  		{
  		  bfd_vma j;
  		  char *s;
  
  		  putchar ('\n');
! 		  j = i + pb;
  
! 		  sprintf_vma (buf, section->vma + j);
  		  for (s = buf + skip_addr_chars; *s == '0'; s++)
  		    *s = ' ';
  		  if (*s == '\0')
  		    *--s = '0';
  		  printf ("%s:\t", buf + skip_addr_chars);
  
! 		  pb += bytes_per_line;
! 		  if (pb > bytes)
! 		    pb = bytes;
! 		  for (; j < i + pb; j += bpc)
  		    {
  		      int k;
  
--- 1456,1480 ----
  	      ? show_raw_insn > 0
  	      : show_raw_insn >= 0)
  	    {
! 	      while (pb < octets)
  		{
  		  bfd_vma j;
  		  char *s;
  
  		  putchar ('\n');
! 		  j = addr_offset * opb + pb;
  
! 		  sprintf_vma (buf, section->vma + j / opb);
  		  for (s = buf + skip_addr_chars; *s == '0'; s++)
  		    *s = ' ';
  		  if (*s == '\0')
  		    *--s = '0';
  		  printf ("%s:\t", buf + skip_addr_chars);
  
! 		  pb += octets_per_line;
! 		  if (pb > octets)
! 		    pb = octets;
! 		  for (; j < addr_offset * opb + pb; j += bpc)
  		    {
  		      int k;
  
*************** disassemble_bytes (info, disassemble_fn,
*** 1499,1506 ****
  	  && (section->flags & SEC_RELOC) != 0)
  	{
  	  while ((*relppp) < relppend
! 		 && ((**relppp)->address >= (bfd_vma) i
! 		     && (**relppp)->address < (bfd_vma) i + bytes))
  	    {
  	      arelent *q;
  
--- 1504,1511 ----
  	  && (section->flags & SEC_RELOC) != 0)
  	{
  	  while ((*relppp) < relppend
! 		 && ((**relppp)->address >= (bfd_vma) addr_offset
! 		     && (**relppp)->address < (bfd_vma) addr_offset + octets / opb))
  	    {
  	      arelent *q;
  
*************** disassemble_bytes (info, disassemble_fn,
*** 1551,1557 ****
        if (need_nl)
  	printf ("\n");
  
!       i += bytes;
      }
  }
  
--- 1556,1562 ----
        if (need_nl)
  	printf ("\n");
  
!       addr_offset += octets / opb;
      }
  }
  
*************** static void
*** 1561,1571 ****
  disassemble_data (abfd)
       bfd *abfd;
  {
!   long i;
    disassembler_ftype disassemble_fn;
    struct disassemble_info disasm_info;
    struct objdump_disasm_info aux;
    asection *section;
  
    print_files = NULL;
    prev_functionname = NULL;
--- 1566,1577 ----
  disassemble_data (abfd)
       bfd *abfd;
  {
!   long addr_offset;
    disassembler_ftype disassemble_fn;
    struct disassemble_info disasm_info;
    struct objdump_disasm_info aux;
    asection *section;
+   int opb = bfd_octets_per_byte (abfd);
  
    print_files = NULL;
    prev_functionname = NULL;
*************** disassemble_data (abfd)
*** 1587,1592 ****
--- 1593,1599 ----
    aux.require_sec = false;
    disasm_info.print_address_func = objdump_print_address;
    disasm_info.symbol_at_address_func = objdump_symbol_at_address;
+   disasm_info.octets_per_byte = opb;
  
    if (machine != (char *) NULL)
      {
*************** disassemble_data (abfd)
*** 1644,1650 ****
        arelent **relbuf = NULL;
        arelent **relpp = NULL;
        arelent **relppend = NULL;
!       long stop;
        asymbol *sym = NULL;
        long place = 0;
  
--- 1651,1657 ----
        arelent **relbuf = NULL;
        arelent **relpp = NULL;
        arelent **relppend = NULL;
!       long stop_offset;
        asymbol *sym = NULL;
        long place = 0;
  
*************** disassemble_data (abfd)
*** 1707,1743 ****
        disasm_info.buffer_length = datasize;
        if (start_address == (bfd_vma) -1
  	  || start_address < disasm_info.buffer_vma)
! 	i = 0;
        else
! 	i = start_address - disasm_info.buffer_vma;
        if (stop_address == (bfd_vma) -1)
! 	stop = datasize;
        else
  	{
  	  if (stop_address < disasm_info.buffer_vma)
! 	    stop = 0;
  	  else
! 	    stop = stop_address - disasm_info.buffer_vma;
! 	  if (stop > disasm_info.buffer_length)
! 	    stop = disasm_info.buffer_length;
  	}
  
!       sym = find_symbol_for_address (abfd, section, section->vma + i,
  				     true, &place);
  
!       while (i < stop)
  	{
  	  asymbol *nextsym;
! 	  long nextstop;
  	  boolean insns;
  	  
! 	  if (sym != NULL && bfd_asymbol_value (sym) <= section->vma + i)
  	    {
  	      int x;
  
  	      for (x = place;
  		   (x < sorted_symcount
! 		    && bfd_asymbol_value (sorted_syms[x]) <= section->vma + i);
  		   ++x)
  		continue;
  	      disasm_info.symbols = & sorted_syms[place];
--- 1714,1750 ----
        disasm_info.buffer_length = datasize;
        if (start_address == (bfd_vma) -1
  	  || start_address < disasm_info.buffer_vma)
! 	addr_offset = 0;
        else
! 	addr_offset = start_address - disasm_info.buffer_vma;
        if (stop_address == (bfd_vma) -1)
! 	stop_offset = datasize / opb;
        else
  	{
  	  if (stop_address < disasm_info.buffer_vma)
! 	    stop_offset = 0;
  	  else
! 	    stop_offset = stop_address - disasm_info.buffer_vma;
! 	  if (stop_offset > disasm_info.buffer_length / opb)
! 	    stop_offset = disasm_info.buffer_length / opb;
  	}
  
!       sym = find_symbol_for_address (abfd, section, section->vma + addr_offset,
  				     true, &place);
  
!       while (addr_offset < stop_offset)
  	{
  	  asymbol *nextsym;
! 	  long nextstop_offset;
  	  boolean insns;
  	  
! 	  if (sym != NULL && bfd_asymbol_value (sym) <= section->vma + addr_offset)
  	    {
  	      int x;
  
  	      for (x = place;
  		   (x < sorted_symcount
! 		    && bfd_asymbol_value (sorted_syms[x]) <= section->vma + addr_offset);
  		   ++x)
  		continue;
  	      disasm_info.symbols = & sorted_syms[place];
*************** disassemble_data (abfd)
*** 1750,1762 ****
  	    {
  	      printf ("\n");
  	      objdump_print_addr_with_sym (abfd, section, sym,
! 					   section->vma + i,
  					   &disasm_info,
  					   false);
  	      printf (":\n");
  	    }
  	  
! 	  if (sym != NULL && bfd_asymbol_value (sym) > section->vma + i)
  	    nextsym = sym;
  	  else if (sym == NULL)
  	    nextsym = NULL;
--- 1757,1769 ----
  	    {
  	      printf ("\n");
  	      objdump_print_addr_with_sym (abfd, section, sym,
! 					   section->vma + addr_offset,
  					   &disasm_info,
  					   false);
  	      printf (":\n");
  	    }
  	  
! 	  if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset)
  	    nextsym = sym;
  	  else if (sym == NULL)
  	    nextsym = NULL;
*************** disassemble_data (abfd)
*** 1777,1795 ****
  		nextsym = sorted_syms[place];
  	    }
  	  
! 	  if (sym != NULL && bfd_asymbol_value (sym) > section->vma + i)
  	    {
! 	      nextstop = bfd_asymbol_value (sym) - section->vma;
! 	      if (nextstop > stop)
! 		nextstop = stop;
  	    }
  	  else if (nextsym == NULL)
! 	    nextstop = stop;
  	  else
  	    {
! 	      nextstop = bfd_asymbol_value (nextsym) - section->vma;
! 	      if (nextstop > stop)
! 		nextstop = stop;
  	    }
  	  
  	  /* If a symbol is explicitly marked as being an object
--- 1784,1802 ----
  		nextsym = sorted_syms[place];
  	    }
  	  
! 	  if (sym != NULL && bfd_asymbol_value (sym) > section->vma + addr_offset)
  	    {
! 	      nextstop_offset = bfd_asymbol_value (sym) - section->vma;
! 	      if (nextstop_offset > stop_offset)
! 		nextstop_offset = stop_offset;
  	    }
  	  else if (nextsym == NULL)
! 	    nextstop_offset = stop_offset;
  	  else
  	    {
! 	      nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
! 	      if (nextstop_offset > stop_offset)
! 		nextstop_offset = stop_offset;
  	    }
  	  
  	  /* If a symbol is explicitly marked as being an object
*************** disassemble_data (abfd)
*** 1797,1803 ****
  	     disassembling them.  */
  	  if (disassemble_all
  	      || sym == NULL
! 	      || bfd_asymbol_value (sym) > section->vma + i
  	      || ((sym->flags & BSF_OBJECT) == 0
  		  && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
  		      == NULL)
--- 1804,1810 ----
  	     disassembling them.  */
  	  if (disassemble_all
  	      || sym == NULL
! 	      || bfd_asymbol_value (sym) > section->vma + addr_offset
  	      || ((sym->flags & BSF_OBJECT) == 0
  		  && (strstr (bfd_asymbol_name (sym), "gnu_compiled")
  		      == NULL)
*************** disassemble_data (abfd)
*** 1808,1817 ****
  	  else
  	    insns = false;
  	  
! 	  disassemble_bytes (&disasm_info, disassemble_fn, insns, data, i,
! 			     nextstop, &relpp, relppend);
  	  
! 	  i = nextstop;
  	  sym = nextsym;
  	}
        
--- 1815,1824 ----
  	  else
  	    insns = false;
  	  
! 	  disassemble_bytes (&disasm_info, disassemble_fn, insns, data, 
!                              addr_offset, nextstop_offset, &relpp, relppend);
  	  
! 	  addr_offset = nextstop_offset;
  	  sym = nextsym;
  	}
        
*************** dump_data (abfd)
*** 2247,2254 ****
    asection *section;
    bfd_byte *data = 0;
    bfd_size_type datasize = 0;
!   bfd_size_type i;
!   bfd_size_type start, stop;
  
    for (section = abfd->sections; section != NULL; section =
         section->next)
--- 2254,2262 ----
    asection *section;
    bfd_byte *data = 0;
    bfd_size_type datasize = 0;
!   bfd_size_type addr_offset;
!   bfd_size_type start_offset, stop_offset;
!   int opb = bfd_octets_per_byte (abfd);
  
    for (section = abfd->sections; section != NULL; section =
         section->next)
*************** dump_data (abfd)
*** 2272,2299 ****
  
  	      if (start_address == (bfd_vma) -1
  		  || start_address < section->vma)
! 		start = 0;
  	      else
! 		start = start_address - section->vma;
  	      if (stop_address == (bfd_vma) -1)
! 		stop = bfd_section_size (abfd, section);
  	      else
  		{
  		  if (stop_address < section->vma)
! 		    stop = 0;
  		  else
! 		    stop = stop_address - section->vma;
! 		  if (stop > bfd_section_size (abfd, section))
! 		    stop = bfd_section_size (abfd, section);
  		}
! 	      for (i = start; i < stop; i += onaline)
  		{
  		  bfd_size_type j;
  
! 		  printf (" %04lx ", (unsigned long int) (i + section->vma));
! 		  for (j = i; j < i + onaline; j++)
  		    {
! 		      if (j < stop)
  			printf ("%02x", (unsigned) (data[j]));
  		      else
  			printf ("  ");
--- 2280,2310 ----
  
  	      if (start_address == (bfd_vma) -1
  		  || start_address < section->vma)
! 		start_offset = 0;
  	      else
! 		start_offset = start_address - section->vma;
  	      if (stop_address == (bfd_vma) -1)
! 		stop_offset = bfd_section_size (abfd, section) / opb;
  	      else
  		{
  		  if (stop_address < section->vma)
! 		    stop_offset = 0;
  		  else
! 		    stop_offset = stop_address - section->vma;
! 		  if (stop_offset > bfd_section_size (abfd, section) / opb)
! 		    stop_offset = bfd_section_size (abfd, section) / opb;
  		}
! 	      for (addr_offset = start_offset; 
!                    addr_offset < stop_offset; addr_offset += onaline)
  		{
  		  bfd_size_type j;
  
! 		  printf (" %04lx ", (unsigned long int) 
!                           (addr_offset + section->vma));
! 		  for (j = addr_offset * opb; 
!                        j < addr_offset * opb + onaline; j++)
  		    {
! 		      if (j < stop_offset * opb)
  			printf ("%02x", (unsigned) (data[j]));
  		      else
  			printf ("  ");
*************** dump_data (abfd)
*** 2302,2310 ****
  		    }
  
  		  printf (" ");
! 		  for (j = i; j < i + onaline; j++)
  		    {
! 		      if (j >= stop)
  			printf (" ");
  		      else
  			printf ("%c", isprint (data[j]) ? data[j] : '.');
--- 2313,2321 ----
  		    }
  
  		  printf (" ");
! 		  for (j = addr_offset; j < addr_offset * opb + onaline; j++)
  		    {
! 		      if (j >= stop_offset * opb)
  			printf (" ");
  		      else
  			printf ("%c", isprint (data[j]) ? data[j] : '.');

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