* lib/pseudo-reloc.c: New file.
* lib/_cygwin_crt0_common.cc: Perform pseudo-relocs during initialization of cygwin binary (.exe or .dll).
This commit is contained in:
parent
97cc22ad06
commit
b862c42198
|
@ -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
|
||||
|
|
|
@ -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" */
|
||||
|
|
|
@ -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__);
|
||||
}
|
|
@ -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__);
|
||||
}
|
Loading…
Reference in New Issue