OSDN Git Service

* lib/pseudo-reloc.c: New file.
authorcgf <cgf>
Mon, 9 Dec 2002 22:49:11 +0000 (22:49 +0000)
committercgf <cgf>
Mon, 9 Dec 2002 22:49:11 +0000 (22:49 +0000)
* lib/_cygwin_crt0_common.cc: Perform pseudo-relocs during initialization of
cygwin binary (.exe or .dll).

winsup/cygwin/ChangeLog
winsup/cygwin/lib/_cygwin_crt0_common.cc
winsup/cygwin/lib/pseudo-reloc.c [new file with mode: 0644]

index 607c928..de7ab2b 100644 (file)
@@ -1,3 +1,9 @@
+2002-12-02  Egor Duda <deo@logos-m.ru>
+
+       * lib/pseudo-reloc.c: New file.
+       * lib/_cygwin_crt0_common.cc: Perform pseudo-relocs during
+       initialization of cygwin binary (.exe or .dll).
+
 2002-12-06  Christopher Faylor  <cgf@redhat.com>
 
        * cygwin.din: Reflect name change from strtodf to strtof.  Export
index e0a3e60..565ba25 100644 (file)
@@ -26,6 +26,7 @@ int cygwin_attach_noncygwin_dll (HMODULE, MainFunc);
 int main (int, char **, char **);
 struct _reent *_impure_ptr;
 int _fmode;
+void _pei386_runtime_relocator ();
 
 /* Set up pointers to various pieces so the dll can then use them,
    and then jump to the dll.  */
@@ -94,6 +95,8 @@ _cygwin_crt0_common (MainFunc f, per_process *u)
   u->data_end = &_data_end__;
   u->bss_start = &_bss_start__;
   u->bss_end = &_bss_end__;
+
+  _pei386_runtime_relocator ();
   return 1;
 }
 } /* "C" */
diff --git a/winsup/cygwin/lib/pseudo-reloc.c b/winsup/cygwin/lib/pseudo-reloc.c
new file mode 100644 (file)
index 0000000..5760a69
--- /dev/null
@@ -0,0 +1,46 @@
+/* pseudo-reloc.c
+
+   Written by Egor Duda <deo@logos-m.ru>
+   THIS SOFTWARE IS NOT COPYRIGHTED
+
+   This source code is offered for use in the public domain. You may
+   use, modify or distribute it freely.
+
+   This code is distributed in the hope that it will be useful but
+   WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY
+   DISCLAMED. This includes but is not limited to warrenties of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+#include <windows.h>
+
+extern char __RUNTIME_PSEUDO_RELOC_LIST__;
+extern char __RUNTIME_PSEUDO_RELOC_LIST_END__;
+extern char _image_base__;
+
+typedef struct
+  {
+    DWORD addend;
+    DWORD target;
+  }
+runtime_pseudo_reloc;
+
+void
+do_pseudo_reloc (void* start, void* end, void* base)
+{
+  DWORD reloc_target;
+  runtime_pseudo_reloc* r;
+  for (r = (runtime_pseudo_reloc*) start; r < (runtime_pseudo_reloc*) end; r++)
+    {
+      reloc_target = (DWORD) base + r->target;
+      *((DWORD*) reloc_target) += r->addend;
+    }
+}
+
+void
+_pei386_runtime_relocator ()
+{
+  do_pseudo_reloc (&__RUNTIME_PSEUDO_RELOC_LIST__,
+                  &__RUNTIME_PSEUDO_RELOC_LIST_END__,
+                  &_image_base__);
+}