Fix wrong assumptions
--
Regards
Vladimir 'phcoder' Serbinenko
diff --git a/boot/i386/pc/boot.S b/boot/i386/pc/boot.S
index 8056731..9ccfbca 100644
--- a/boot/i386/pc/boot.S
+++ b/boot/i386/pc/boot.S
@@ -390,11 +390,11 @@ general_error:
int $0x18
stop: jmp stop
-notification_string: .string "GRUB "
-geometry_error_string: .string "Geom"
-hd_probe_error_string: .string "Hard Disk"
-read_error_string: .string "Read"
-general_error_string: .string " Error"
+notification_string: .asciz "GRUB "
+geometry_error_string: .asciz "Geom"
+hd_probe_error_string: .asciz "Hard Disk"
+read_error_string: .asciz "Read"
+general_error_string: .asciz " Error"
/*
* message: write the string pointed to by %si
@@ -464,7 +464,8 @@ probe_loop:
MSG(fd_probe_error_string)
jmp general_error
-fd_probe_error_string: .string "Floppy"
+/* "Floppy" */
+fd_probe_error_string: .asciz "Floppy"
1:
/* perform read */
diff --git a/boot/i386/pc/diskboot.S b/boot/i386/pc/diskboot.S
index 95f87a0..0c8e75d 100644
--- a/boot/i386/pc/diskboot.S
+++ b/boot/i386/pc/diskboot.S
@@ -326,14 +326,14 @@ general_error:
/* go here when you need to stop the machine hard after an error condition */
stop: jmp stop
-notification_string: .string "loading"
+notification_string: .asciz "loading"
-notification_step: .string "."
-notification_done: .string "\r\n"
+notification_step: .asciz "."
+notification_done: .asciz "\r\n"
-geometry_error_string: .string "Geom"
-read_error_string: .string "Read"
-general_error_string: .string " Error"
+geometry_error_string: .asciz "Geom"
+read_error_string: .asciz "Read"
+general_error_string: .asciz " Error"
/*
* message: write the string pointed to by %si
diff --git a/include/grub/dl.h b/include/grub/dl.h
index 4ff6240..55f5d4e 100644
--- a/include/grub/dl.h
+++ b/include/grub/dl.h
@@ -41,10 +41,10 @@ static void \
grub_mod_fini (void)
#define GRUB_MOD_NAME(name) \
-__asm__ (".section .modname\n.string \"" #name "\"\n")
+__asm__ (".section .modname\n.asciz \"" #name "\"\n")
#define GRUB_MOD_DEP(name) \
-__asm__ (".section .moddeps\n.string \"" #name "\"\n")
+__asm__ (".section .moddeps\n.asciz \"" #name "\"\n")
struct grub_dl_segment
{
diff --git a/util/i386/efi/grub-mkimage.c b/util/i386/efi/grub-mkimage.c
index db88a0f..8b87963 100644
--- a/util/i386/efi/grub-mkimage.c
+++ b/util/i386/efi/grub-mkimage.c
@@ -88,7 +88,7 @@ align_pe32_section (Elf_Addr addr)
/* Read the whole kernel image. Return the pointer to a read image,
and store the size in bytes in *SIZE. */
static char *
-read_kernel_module (const char *dir, char *prefix, size_t *size)
+read_kernel_module (const char *dir, size_t *size)
{
char *kernel_image;
char *kernel_path;
@@ -98,11 +98,6 @@ read_kernel_module (const char *dir, char *prefix, size_t *size)
kernel_image = grub_util_read_image (kernel_path);
free (kernel_path);
- if (GRUB_KERNEL_MACHINE_PREFIX + strlen (prefix) + 1 > GRUB_KERNEL_MACHINE_DATA_END)
- grub_util_error ("prefix too long");
-
- strcpy (kernel_image + sizeof (Elf_Ehdr) + GRUB_KERNEL_MACHINE_PREFIX, prefix);
-
return kernel_image;
}
@@ -378,7 +373,8 @@ relocate_addresses (Elf_Ehdr *e, Elf_Shdr *sections,
Elf_Addr info;
Elf_Addr offset;
Elf_Addr sym_addr;
- Elf_Addr *target, *value;
+ Elf_Addr *target;
+ Elf_Addr addend;
offset = grub_le_to_cpu (r->r_offset);
target = get_target_address (e, target_section, offset);
@@ -386,8 +382,8 @@ relocate_addresses (Elf_Ehdr *e, Elf_Shdr *sections,
sym_addr = get_symbol_address (e, symtab_section,
ELF_R_SYM (info));
- value = (s->sh_type == grub_cpu_to_le32 (SHT_RELA)) ?
- (Elf_Addr *) &r->r_addend : target;
+ addend = (s->sh_type == grub_cpu_to_le32 (SHT_RELA)) ?
+ r->r_addend : 0;
switch (ELF_R_TYPE (info))
{
@@ -397,16 +393,16 @@ relocate_addresses (Elf_Ehdr *e, Elf_Shdr *sections,
case R_386_32:
/* This is absolute. */
- *target = grub_cpu_to_le32 (grub_le_to_cpu32 (*value)
- + sym_addr);
+ *target = grub_cpu_to_le32 (grub_le_to_cpu32 (*target)
+ + addend + sym_addr);
grub_util_info ("relocating an R_386_32 entry to 0x%x at the offset 0x%x",
*target, offset);
break;
case R_386_PC32:
/* This is relative. */
- *target = grub_cpu_to_le32 (grub_le_to_cpu32 (*value)
- + sym_addr
+ *target = grub_cpu_to_le32 (grub_le_to_cpu32 (*target)
+ + addend + sym_addr
- target_section_addr - offset);
grub_util_info ("relocating an R_386_PC32 entry to 0x%x at the offset 0x%x",
*target, offset);
@@ -418,7 +414,8 @@ relocate_addresses (Elf_Ehdr *e, Elf_Shdr *sections,
break;
case R_X86_64_64:
- *target = grub_cpu_to_le64 (grub_le_to_cpu64 (*value) + sym_addr);
+ *target = grub_cpu_to_le64 (grub_le_to_cpu64 (*target)
+ + addend + sym_addr);
grub_util_info ("relocating an R_X86_64_64 entry to 0x%llx at the offset 0x%llx",
*target, offset);
break;
@@ -426,8 +423,8 @@ relocate_addresses (Elf_Ehdr *e, Elf_Shdr *sections,
case R_X86_64_PC32:
{
grub_uint32_t *t32 = (grub_uint32_t *) target;
- *t32 = grub_cpu_to_le64 (grub_le_to_cpu64 (*value)
- + sym_addr
+ *t32 = grub_cpu_to_le64 (grub_le_to_cpu32 (*t32)
+ + addend + sym_addr
- target_section_addr - offset);
grub_util_info ("relocating an R_X86_64_PC32 entry to 0x%x at the offset 0x%llx",
*t32, offset);
@@ -438,8 +435,8 @@ relocate_addresses (Elf_Ehdr *e, Elf_Shdr *sections,
case R_X86_64_32S:
{
grub_uint32_t *t32 = (grub_uint32_t *) target;
- *t32 = grub_cpu_to_le64 (grub_le_to_cpu64 (*value)
- + sym_addr);
+ *t32 = grub_cpu_to_le64 (grub_le_to_cpu32 (*t32)
+ + addend + sym_addr);
grub_util_info ("relocating an R_X86_64_32(S) entry to 0x%x at the offset 0x%llx",
*t32, offset);
break;
@@ -689,6 +686,8 @@ make_mods_section (FILE *out, Elf_Addr current_address,
struct grub_module_info modinfo;
Elf_Addr addr;
+ memset (&modinfo, 0, sizeof (modinfo));
+
path_list = grub_util_resolve_dependencies (dir, "moddep.lst", mods);
total_module_size = sizeof (struct grub_module_info);
@@ -713,6 +712,8 @@ make_mods_section (FILE *out, Elf_Addr current_address,
size_t mod_size;
char *mod_image;
+ memset (&header, 0, sizeof (header));
+
grub_util_info ("adding module %s", p->name);
mod_size = grub_util_get_image_size (p->name);
@@ -973,9 +974,11 @@ convert_elf (const char *dir, char *prefix, FILE *out, char *mods[])
Elf_Addr start_address;
Elf_Addr text_address, data_address, reloc_address, mods_address;
Elf_Addr end_address;
+ Elf_Shdr *s;
+ int i;
/* Get the kernel image and check the format. */
- kernel_image = read_kernel_module (dir, prefix, &kernel_size);
+ kernel_image = read_kernel_module (dir, &kernel_size);
e = (Elf_Ehdr *) kernel_image;
if (! check_elf_header (e, kernel_size))
grub_util_error ("invalid ELF header");
@@ -990,6 +993,20 @@ convert_elf (const char *dir, char *prefix, FILE *out, char *mods[])
sections = (Elf_Shdr *) (kernel_image + section_offset);
strtab = find_strtab (e, sections, section_entsize);
+ for (i = 0, s = sections;
+ i < num_sections;
+ i++, s = (Elf_Shdr *) ((char *) s + section_entsize))
+ if (is_text_section (s))
+ {
+ Elf_Off offset = grub_le_to_cpu32 (s->sh_offset);
+
+ if (GRUB_KERNEL_MACHINE_PREFIX + strlen (prefix) + 1 > GRUB_KERNEL_MACHINE_DATA_END)
+ grub_util_error ("prefix too long");
+
+ strcpy (kernel_image + offset + GRUB_KERNEL_MACHINE_PREFIX, prefix);
+ break;
+ }
+
/* Relocate sections then symbols in the virtual address space. */
section_addresses = locate_sections (sections, section_entsize,
num_sections, strtab);
_______________________________________________
Grub-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/grub-devel