This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch#2] bfd: Use size_t for length argument totarget_read_memory function passed into bfd_elf_bfd_from_remote_memory


On Fri, 01 Jun 2012 22:31:23 +0200, Jan Kratochvil wrote:
> On Fri, 01 Jun 2012 21:54:10 +0200, Siddhesh Poyarekar wrote:
> > Should be OK as long as it always matches the size_t definition in the
> > stddef.h that gcc ships.
> 
> It is larger in some cases than size_t;

CFLAGS="-g -m32" ./configure --enable-64-bit-bfd i386-unknown-linux-gnu

symfile-mem.c: In function ‘symbol_file_add_from_memory’:
symfile-mem.c:80:7: error: passing argument 4 of ‘bfd_elf_bfd_from_remote_memory’ from incompatible pointer type [-Werror]
In file included from defs.h:101:0,
                 from symfile-mem.c:45:
../bfd/bfd.h:706:13: note: expected ‘int (*)(bfd_vma,  bfd_byte *, bfd_size_type)’ but argument is of type ‘int (*)(CORE_ADDR,  gdb_byte *, size_t)’


> Going to post a patch today as keeping HEAD broken is not good.

Below.


Sorry,
Jan



bfd/
2012-06-01  Jan Kratochvil  <jan.kratochvil@redhat.com>

    	* bfd-in.h (bfd_elf_bfd_from_remote_memory): Make LEN argument
    	of target_read_memory as bfd_size_type.
    	* bfd-in2.h: Regenerate.
    	* elf-bfd.h (elf_backend_bfd_from_remote_memory): Make LEN
    	argument of target_read_memory as size_t.
    	(_bfd_elf32_bfd_from_remote_memory): Likewise.
    	(_bfd_elf64_bfd_from_remote_memory): Likewise.
    	* elf.c (bfd_elf_bfd_from_remote_memory): Likewise.
    	* elfcode.h (NAME(_bfd_elf,bfd_from_remote_memory)): Likewise.
    
gdb/
2012-06-01  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* symfile-mem.c: 3 new gdb_static_assert for target_read_memory_bfd
	parameters.
	(target_read_memory_bfd): New function.
	(symbol_file_add_from_memory): Use it.

diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h
index 9617428..5300b14 100644
--- a/bfd/bfd-in.h
+++ b/bfd/bfd-in.h
@@ -698,7 +698,8 @@ extern int bfd_get_elf_phdrs
    the remote memory.  */
 extern bfd *bfd_elf_bfd_from_remote_memory
   (bfd *templ, bfd_vma ehdr_vma, bfd_vma *loadbasep,
-   int (*target_read_memory) (bfd_vma vma, bfd_byte *myaddr, size_t len));
+   int (*target_read_memory) (bfd_vma vma, bfd_byte *myaddr,
+			      bfd_size_type len));
 
 extern struct bfd_section *_bfd_elf_tls_setup
   (bfd *, struct bfd_link_info *);
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 585a54a..8798ae4 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -705,7 +705,8 @@ extern int bfd_get_elf_phdrs
    the remote memory.  */
 extern bfd *bfd_elf_bfd_from_remote_memory
   (bfd *templ, bfd_vma ehdr_vma, bfd_vma *loadbasep,
-   int (*target_read_memory) (bfd_vma vma, bfd_byte *myaddr, size_t len));
+   int (*target_read_memory) (bfd_vma vma, bfd_byte *myaddr,
+			      bfd_size_type len));
 
 extern struct bfd_section *_bfd_elf_tls_setup
   (bfd *, struct bfd_link_info *);
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index fcfb42a..6105287 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -1186,7 +1186,8 @@ struct elf_backend_data
      see elf.c, elfcode.h.  */
   bfd *(*elf_backend_bfd_from_remote_memory)
      (bfd *templ, bfd_vma ehdr_vma, bfd_vma *loadbasep,
-      int (*target_read_memory) (bfd_vma vma, bfd_byte *myaddr, size_t len));
+      int (*target_read_memory) (bfd_vma vma, bfd_byte *myaddr,
+				 bfd_size_type len));
 
   /* This function is used by `_bfd_elf_get_synthetic_symtab';
      see elf.c.  */
@@ -2260,10 +2261,10 @@ extern char *elfcore_write_register_note
 
 extern bfd *_bfd_elf32_bfd_from_remote_memory
   (bfd *templ, bfd_vma ehdr_vma, bfd_vma *loadbasep,
-   int (*target_read_memory) (bfd_vma, bfd_byte *, size_t));
+   int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type));
 extern bfd *_bfd_elf64_bfd_from_remote_memory
   (bfd *templ, bfd_vma ehdr_vma, bfd_vma *loadbasep,
-   int (*target_read_memory) (bfd_vma, bfd_byte *, size_t));
+   int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type));
 
 extern bfd_vma bfd_elf_obj_attr_size (bfd *);
 extern void bfd_elf_set_obj_attr_contents (bfd *, bfd_byte *, bfd_vma);
diff --git a/bfd/elf.c b/bfd/elf.c
index 7a06fb4..d660d7f 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -9556,7 +9556,7 @@ bfd_elf_bfd_from_remote_memory
   (bfd *templ,
    bfd_vma ehdr_vma,
    bfd_vma *loadbasep,
-   int (*target_read_memory) (bfd_vma, bfd_byte *, size_t))
+   int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
 {
   return (*get_elf_backend_data (templ)->elf_backend_bfd_from_remote_memory)
     (templ, ehdr_vma, loadbasep, target_read_memory);
diff --git a/bfd/elfcode.h b/bfd/elfcode.h
index 2c8fe2b..cc55c86 100644
--- a/bfd/elfcode.h
+++ b/bfd/elfcode.h
@@ -1615,7 +1615,7 @@ NAME(_bfd_elf,bfd_from_remote_memory)
   (bfd *templ,
    bfd_vma ehdr_vma,
    bfd_vma *loadbasep,
-   int (*target_read_memory) (bfd_vma, bfd_byte *, size_t))
+   int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
 {
   Elf_External_Ehdr x_ehdr;	/* Elf file header, external form */
   Elf_Internal_Ehdr i_ehdr;	/* Elf file header, internal form */
diff --git a/gdb/symfile-mem.c b/gdb/symfile-mem.c
index 91125e1..45d95a7 100644
--- a/gdb/symfile-mem.c
+++ b/gdb/symfile-mem.c
@@ -55,6 +55,25 @@
 #include "auxv.h"
 #include "elf/common.h"
 
+/* Verify parameters of target_read_memory_bfd and target_read_memory are
+   compatible.  */
+
+gdb_static_assert (sizeof (CORE_ADDR) == sizeof (bfd_vma));
+gdb_static_assert (sizeof (gdb_byte) == sizeof (bfd_byte));
+gdb_static_assert (sizeof (size_t) <= sizeof (bfd_size_type));
+
+/* Provide bfd/ compatible prototype for target_read_memory.  Casting would not
+   be enough as LEN width may differ.  */
+
+static int
+target_read_memory_bfd (bfd_vma memaddr, bfd_byte *myaddr, bfd_size_type len)
+{
+  /* MYADDR must be already allocated for the LEN size so it has to fit in
+     size_t.  */
+  gdb_assert ((size_t) len == len);
+
+  return target_read_memory (memaddr, myaddr, len);
+}
 
 /* Read inferior memory at ADDR to find the header of a loaded object file
    and read its in-core symbols out of inferior memory.  TEMPL is a bfd
@@ -77,7 +96,7 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name,
     error (_("add-symbol-file-from-memory not supported for this target"));
 
   nbfd = bfd_elf_bfd_from_remote_memory (templ, addr, &loadbase,
-					 target_read_memory);
+					 target_read_memory_bfd);
   if (nbfd == NULL)
     error (_("Failed to read a valid object file image from memory."));
 


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