b862c42198
* lib/_cygwin_crt0_common.cc: Perform pseudo-relocs during initialization of cygwin binary (.exe or .dll).
47 lines
1.1 KiB
C
47 lines
1.1 KiB
C
/* 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__);
|
|
}
|