* Robert Millan <[EMAIL PROTECTED]> [071014 14:00]:
> > We tried the same but the patch was a lot bigger, trying to actually
> > leave space in the beginning. Your patch might be enough, that would be
> > really nice.
> 
> That's the question.  Do we really have to add more space, or is that space
> already allocated for us?

Ok, I am not exactly sure how to correctly adapt to the latest
grub-mkimage changes, so please bear that the attached patch is against
Patrick's GSoC version of grub-mkimage.c

With this patch attached, grub-mkimage produces an image that works when
being loaded as payload from LinuxBIOS version 2.

Your smaller version of the patch unfortunately did not work for me.

Flames and suggestions please! 

Best wishes, 

Stefan


--- grub-mkimage.c.orig	2007-10-05 20:33:50.000000000 +0000
+++ grub-mkimage.c	2007-10-15 18:20:03.000000000 +0000
@@ -104,7 +104,7 @@
   FILE *in;
   char *kernel_path;
   grub_addr_t grub_end = 0;
-  off_t phdroff;
+  off_t phdroff, pstart;
   int i;
 
   /* Read ELF header.  */
@@ -115,18 +115,27 @@
 
   grub_util_read_at (&ehdr, sizeof (ehdr), 0, in);
   
+  /* The +1 is to leave a hole for the program header for extra modules. */
   phdrs = xmalloc (grub_le_to_cpu16 (ehdr.e_phentsize)
-		   * (grub_le_to_cpu16 (ehdr.e_phnum) + 2));
+		   * (grub_le_to_cpu16 (ehdr.e_phnum) + 1));
+  
+  /* Append entire segment table to the file.  */
+  //phdroff = ALIGN_UP (grub_util_get_fp_size (out), sizeof (long));
+  phdroff = ALIGN_UP (sizeof(ehdr), sizeof (long));
+  grub_util_write_image_at (phdrs, grub_le_to_cpu16 (ehdr.e_phentsize)
+			    *(grub_le_to_cpu16 (ehdr.e_phnum) + 1), phdroff,
+			    out);
+
   /* Copy all existing segments.  */
   grub_util_info ("%u segments", grub_le_to_cpu16 (ehdr.e_phnum));
+  pstart = grub_util_get_fp_size (out);
+  /* set up first phdr offset */
   for (i = 0; i < grub_le_to_cpu16 (ehdr.e_phnum); i++)
     {
       char *segment_img;
       grub_size_t segment_end;
-
       phdr = phdrs + i;
-
-      /* Read segment header.  */
+     /* Read segment header.  */
       grub_util_read_at (phdr, sizeof (Elf32_Phdr),
 			 (grub_le_to_cpu32 (ehdr.e_phoff)
 			  + (i * grub_le_to_cpu16 (ehdr.e_phentsize))),
@@ -146,9 +155,11 @@
   
       grub_util_read_at (segment_img, grub_le_to_cpu32 (phdr->p_filesz),
 			 grub_le_to_cpu32 (phdr->p_offset), in);
-      grub_util_write_image_at (segment_img, grub_le_to_cpu32 (phdr->p_filesz),
+     phdr->p_offset = grub_cpu_to_le32(pstart);
+     grub_util_write_image_at (segment_img, grub_le_to_cpu32 (phdr->p_filesz),
 				grub_le_to_cpu32 (phdr->p_offset), out);
 
+      pstart += phdr->p_filesz;
       free (segment_img);
     }
 
@@ -176,9 +187,9 @@
   ehdr.e_shstrndx = 0;
 
   /* Append entire segment table to the file.  */
-  phdroff = ALIGN_UP (grub_util_get_fp_size (out), sizeof (long));
+  // phdroff = ALIGN_UP (grub_util_get_fp_size (out), sizeof (long));
   grub_util_write_image_at (phdrs, grub_le_to_cpu16 (ehdr.e_phentsize)
-			    * grub_le_to_cpu16 (ehdr.e_phnum), phdroff,
+			    * (grub_le_to_cpu16 (ehdr.e_phnum)), phdroff,
 			    out);
 
   /* Write ELF header.  */
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to