* 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>
|
2002-12-06 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
* cygwin.din: Reflect name change from strtodf to strtof. Export
|
* 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 **);
|
int main (int, char **, char **);
|
||||||
struct _reent *_impure_ptr;
|
struct _reent *_impure_ptr;
|
||||||
int _fmode;
|
int _fmode;
|
||||||
|
void _pei386_runtime_relocator ();
|
||||||
|
|
||||||
/* Set up pointers to various pieces so the dll can then use them,
|
/* Set up pointers to various pieces so the dll can then use them,
|
||||||
and then jump to the dll. */
|
and then jump to the dll. */
|
||||||
@ -94,6 +95,8 @@ _cygwin_crt0_common (MainFunc f, per_process *u)
|
|||||||
u->data_end = &_data_end__;
|
u->data_end = &_data_end__;
|
||||||
u->bss_start = &_bss_start__;
|
u->bss_start = &_bss_start__;
|
||||||
u->bss_end = &_bss_end__;
|
u->bss_end = &_bss_end__;
|
||||||
|
|
||||||
|
_pei386_runtime_relocator ();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
} /* "C" */
|
} /* "C" */
|
||||||
|
46
winsup/cygwin/lib/pseudo-reloc.c
Normal file
46
winsup/cygwin/lib/pseudo-reloc.c
Normal file
@ -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__);
|
||||||
|
}
|
46
winsup/cygwin/pseudo-reloc.cc
Normal file
46
winsup/cygwin/pseudo-reloc.cc
Normal file
@ -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…
x
Reference in New Issue
Block a user