]> code.delx.au - gnu-emacs/commitdiff
* unexmacosx.c (copy_data_segment): Copy initialized data in statically linked librar...
authorYAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
Wed, 8 Aug 2012 05:44:53 +0000 (14:44 +0900)
committerYAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
Wed, 8 Aug 2012 05:44:53 +0000 (14:44 +0900)
src/ChangeLog
src/unexmacosx.c

index eac08d19da47080b5a3aa9d90a027346126e4d60..963179cb08f091d365b6322ef0dd152a36ce1cd5 100644 (file)
@@ -1,3 +1,8 @@
+2012-08-08  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
+
+       * unexmacosx.c (copy_data_segment): Copy initialized data in
+       statically linked libraries from input file rather than memory.
+
 2012-08-07  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 
        * unexmacosx.c (print_load_command_name): Add cases LC_MAIN,
index 8661ee4be1ba73d7339bbac8c7d9603e58cd5639..b2b7c5f8e900d907bec32a9c2b246c7c4204eab2 100644 (file)
@@ -815,8 +815,24 @@ copy_data_segment (struct load_command *lc)
         file.  */
       if (strncmp (sectp->sectname, SECT_DATA, 16) == 0)
        {
-         if (!unexec_write (sectp->offset, (void *) sectp->addr, sectp->size))
+         extern char my_edata[];
+         unsigned long my_size;
+
+         /* The __data section is basically dumped from memory.  But
+            initialized data in statically linked libraries are
+            copied from the input file.  In particular,
+            add_image_hook.names and add_image_hook.pointers stored
+            by libarclite_macosx.a, are restored so that they will be
+            reinitialized when the dumped binary is executed.  */
+         my_size = (unsigned long)my_edata - sectp->addr;
+         if (!(sectp->addr <= (unsigned long)my_edata
+               && my_size <= sectp->size))
+           unexec_error ("my_edata is not in section %s", SECT_DATA);
+         if (!unexec_write (sectp->offset, (void *) sectp->addr, my_size))
            unexec_error ("cannot write section %s", SECT_DATA);
+         if (!unexec_copy (sectp->offset + my_size, old_file_offset + my_size,
+                           sectp->size - my_size))
+           unexec_error ("cannot copy section %s", SECT_DATA);
          if (!unexec_write (header_offset, sectp, sizeof (struct section)))
            unexec_error ("cannot write section %s's header", SECT_DATA);
        }