summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/pseudo-reloc.cc
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2002-12-09 22:49:12 +0000
committerChristopher Faylor <me@cgf.cx>2002-12-09 22:49:12 +0000
commitb862c4219812f85712f7c7ea521c1c6cf4bcc198 (patch)
treefc3940a53b2d70a49fcdfe2c87687bf818db00b0 /winsup/cygwin/pseudo-reloc.cc
parent97cc22ad0662edd32330fc6e3ab0b9dd82dada1e (diff)
downloadcygnal-b862c4219812f85712f7c7ea521c1c6cf4bcc198.tar.gz
cygnal-b862c4219812f85712f7c7ea521c1c6cf4bcc198.tar.bz2
cygnal-b862c4219812f85712f7c7ea521c1c6cf4bcc198.zip
* lib/pseudo-reloc.c: New file.
* lib/_cygwin_crt0_common.cc: Perform pseudo-relocs during initialization of cygwin binary (.exe or .dll).
Diffstat (limited to 'winsup/cygwin/pseudo-reloc.cc')
-rw-r--r--winsup/cygwin/pseudo-reloc.cc46
1 files changed, 46 insertions, 0 deletions
diff --git a/winsup/cygwin/pseudo-reloc.cc b/winsup/cygwin/pseudo-reloc.cc
new file mode 100644
index 000000000..5760a69ad
--- /dev/null
+++ b/winsup/cygwin/pseudo-reloc.cc
@@ -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__);
+}