patch-2.4.23 linux-2.4.23/fs/binfmt_elf.c
Next file: linux-2.4.23/fs/buffer.c
Previous file: linux-2.4.23/fs/Config.in
Back to the patch index
Back to the overall index
- Lines: 42
- Date:
2003-11-28 10:26:21.000000000 -0800
- Orig file:
linux-2.4.22/fs/binfmt_elf.c
- Orig date:
2003-08-25 04:44:43.000000000 -0700
diff -urN linux-2.4.22/fs/binfmt_elf.c linux-2.4.23/fs/binfmt_elf.c
@@ -440,6 +440,7 @@
unsigned int size;
unsigned long elf_entry, interp_load_addr = 0;
unsigned long start_code, end_code, start_data, end_data;
+ unsigned long reloc_func_desc = 0;
struct elfhdr elf_ex;
struct elfhdr interp_elf_ex;
struct exec interp_ex;
@@ -686,6 +687,7 @@
load_bias += error -
ELF_PAGESTART(load_bias + vaddr);
load_addr += load_bias;
+ reloc_func_desc = load_addr;
}
}
k = elf_ppnt->p_vaddr;
@@ -727,6 +729,7 @@
retval = -ENOEXEC; /* Nobody gets to see this, but.. */
goto out_free_dentry;
}
+ reloc_func_desc = interp_load_addr;
allow_write_access(interpreter);
fput(interpreter);
@@ -793,10 +796,14 @@
/*
* The ABI may specify that certain registers be set up in special
* ways (on i386 %edx is the address of a DT_FINI function, for
- * example. This macro performs whatever initialization to
- * the regs structure is required.
+ * example. In addition, it may also specify (eg, PowerPC64 ELF)
+ * that the e_entry field is the address of the function descriptor
+ * for the startup routine, rather than the address of the startup
+ * routine itself. This macro performs whatever initialization to
+ * the regs structure is required as well as any relocations to the
+ * function descriptor entries when executing dynamically linked apps.
*/
- ELF_PLAT_INIT(regs);
+ ELF_PLAT_INIT(regs, reloc_func_desc);
#endif
start_thread(regs, elf_entry, bprm->p);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)