#include #include typedef struct { DWORD addend; DWORD target; } cygwin_reloc; extern cygwin_reloc __CYGWIN_RELOC_LIST__; extern cygwin_reloc __CYGWIN_RELOC_LIST_END__; extern void* _data_start__; extern void* _image_base__; extern int foobar[3]; void perform_cygreloc (cygwin_reloc* start, cygwin_reloc* end) { DWORD reloc_target; cygwin_reloc* r; for (r = start; r < end; r++) { printf ("ptr=%x, addend=%d\n", (long)r->target, r->addend); reloc_target = (DWORD) &_image_base__ + r->target; printf ("reloc target=%x\n", reloc_target); *((DWORD*) reloc_target) += r->addend; } } int main () { perform_cygreloc (&__CYGWIN_RELOC_LIST__, &__CYGWIN_RELOC_LIST_END__); printf ("data=%d %d %d\n", foobar[0], foobar[1], foobar[2]); return 0; }