summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libdl/_dl_relocate.c
diff options
context:
space:
mode:
authorMystery Man <unknown@mandriva.org>2003-08-20 07:37:27 +0000
committerMystery Man <unknown@mandriva.org>2003-08-20 07:37:27 +0000
commit7f2ac73888b8ef372ea597049981b27e7d810ac2 (patch)
tree354132889b63bbe5f446cb82869b3c3367135a80 /mdk-stage1/dietlibc/libdl/_dl_relocate.c
parent327bd24f8e4291bd1882de1990dd7339f781a9cb (diff)
downloaddrakx-topic/MDKC_1_0.tar
drakx-topic/MDKC_1_0.tar.gz
drakx-topic/MDKC_1_0.tar.bz2
drakx-topic/MDKC_1_0.tar.xz
drakx-topic/MDKC_1_0.zip
This commit was manufactured by cvs2svn to create branch 'MDKC_1_0'.topic/MDKC_1_0
Diffstat (limited to 'mdk-stage1/dietlibc/libdl/_dl_relocate.c')
-rw-r--r--mdk-stage1/dietlibc/libdl/_dl_relocate.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/mdk-stage1/dietlibc/libdl/_dl_relocate.c b/mdk-stage1/dietlibc/libdl/_dl_relocate.c
new file mode 100644
index 000000000..e91e48ccf
--- /dev/null
+++ b/mdk-stage1/dietlibc/libdl/_dl_relocate.c
@@ -0,0 +1,96 @@
+#include "_dl_int.h"
+
+#include "_dl_rel.h"
+
+#if 0
+/*--- are other relocation types vital to shared objects ? ---*/
+
+ R_386_NONE 0 /* No reloc */
+ R_386_32 1 /* Direct 32 bit */
+ R_386_COPY 5 /* Copy symbol at runtime ?!? */
+ R_386_GLOB_DAT 6 /* Create GOT entry */
+ R_386_JMP_SLOT 7 /* Create PLT entry */
+ R_386_RELATIVE 8 /* Adjust by program base */
+
+ R_ARM_NONE 0 /* No reloc */
+ R_ARM_ABS32 2 /* Direct 32 bit */
+ R_ARM_COPY 20 /* Copy symbol at runtime */
+ R_ARM_GLOB_DAT 21 /* Create GOT entry */
+ R_ARM_JUMP_SLOT 22 /* Create PLT entry */
+ R_ARM_RELATIVE 23 /* Adjust by program base */
+
+#endif
+
+static int _dl_apply_relocate(struct _dl_handle*dh,_dl_rel_t*rel) {
+ int typ,ret=0;
+ Elf_Addr*loc;
+
+ loc=(Elf_Addr *)(dh->mem_base+rel->r_offset);
+
+#ifdef DEBUG
+#if 0
+ pf(__FUNCTION__); pf(": "); ph(ELF_R_TYPE(rel->r_info)); pf(" @ "); ph((unsigned long)loc);
+ pf(" preval "); ph(*(unsigned long*)loc); pf("\n");
+#endif
+#endif
+
+ typ=ELF_R_TYPE(rel->r_info);
+
+#ifdef __i386__
+ if (typ==R_386_32) { /* 1 */
+ *loc=(unsigned long)(dh->mem_base+dh->dyn_sym_tab[ELF_R_SYM(rel->r_info)].st_value);
+ } else if (typ==R_386_COPY) { /* 5 */
+ int len=dh->dyn_sym_tab[ELF_R_SYM(rel->r_info)].st_size;
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": R_386_COPY !\n");
+#endif
+ memcpy(loc,(void*)(unsigned long)_dl_sym(dh,ELF_R_SYM(rel->r_info)),len);
+ } else if (typ==R_386_GLOB_DAT) { /* 6 */
+ *loc=(unsigned long)_dl_sym(dh,ELF_R_SYM(rel->r_info));
+ } else if (typ==R_386_JMP_SLOT) { /* 7 */
+ *loc+=(unsigned long)dh->mem_base;
+ } else if (typ==R_386_RELATIVE) { /* 8 */
+ *loc+=(unsigned long)dh->mem_base;
+ } else if (typ==R_386_NONE) { /* 0 */
+ } else
+ ret=1;
+#endif
+#ifdef __arm__
+ if (typ==R_ARM_ABS32) { /* 2 */
+ *loc=(unsigned long)(dh->mem_base+dh->dyn_sym_tab[ELF_R_SYM(rel->r_info)].st_value);
+ } else if (typ==R_ARM_COPY) { /* 20 */
+ int len=dh->dyn_sym_tab[ELF_R_SYM(rel->r_info)].st_size;
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": R_ARM_COPY !\n");
+#endif
+ memcpy(loc,(void*)(unsigned long)_dl_sym(dh,ELF_R_SYM(rel->r_info)),len);
+ } else if (typ==R_ARM_GLOB_DAT) { /* 21 */
+ *loc=(unsigned long)_dl_sym(dh,ELF_R_SYM(rel->r_info));
+ } else if (typ==R_ARM_JUMP_SLOT) { /* 22 */
+ *loc+=(unsigned long)dh->mem_base;
+ } else if (typ==R_ARM_RELATIVE) { /* 23 */
+ *loc+=(unsigned long)dh->mem_base;
+ } else if (typ==R_ARM_NONE) { /* 0 */
+ } else
+ ret=1;
+#endif
+
+#ifdef DEBUG
+ pf(__FUNCTION__); pf(": @ "); ph((unsigned long)loc); pf(" val "); ph(*(unsigned long*)loc); pf("\n");
+#endif
+ return ret;
+}
+
+#ifdef __DIET_LD_SO__
+static
+#endif
+int _dl_relocate(struct _dl_handle*dh,_dl_rel_t *rel,int num) {
+ int i;
+ for (i=0;i<num;i++) {
+ if (_dl_apply_relocate(dh,rel+i)) {
+ _dl_error=4;
+ return 1;
+ }
+ }
+ return 0;
+}