+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
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. */
u->data_end = &_data_end__;
u->bss_start = &_bss_start__;
u->bss_end = &_bss_end__;
+
+ _pei386_runtime_relocator ();
return 1;
}
} /* "C" */
--- /dev/null
+/* 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__);
+}