* Makefile.in: Use variables rather than configure constructs where

appropriate.
(LIBCOS): Find additional stub library stuff in their own subdirectory.
* dcrt0.cc: Convert user_data pointer to static __cygwin_user_data area.
(do_global_ctors): Check magic_bisquit for initialization.
(dll_crt0_1): First group of premain functions prior to fd initialization.  Run
second group before calling main.
(dll_crt0 ()): New function, called from new initialization code.
(dll_crt0 (per_process *uptr)): Call new dll_crt0 () function on
initialization.
* debug.cc (thread_stub): Initialize bottom of stack with per-thread info.
* environ.cc (parse_thing): Use binmode global to control CYGWIN=binmode
behavior.
* fhandler.cc (fhandler_base::open): Allow explicit setting of __fmode to
O_BINARY or O_TEXT to override disk mount settings.
* libcmain.cc: Move to lib subdirectory.
* libccrt0.cc: Ditto.
* dll_main.cc: Ditto.
* dll_entry.cc: Ditto.
* getopt.c: Ditto.
* thread.cc (thread_init_wrapper): Call ExitThread explicitly rather than
returning, as a preliminary step towards placing per thread info at the bottom
of the stack.
* winsup.h: Move per_process class to include/sys/cygwin.h.  Declare new
dll_crt0().
* include/cygwin/version.h: Bump API minor version.
* binmode.c: New file.
* textmode.c: Ditto.
* lib/_cygwin_crt0_common.cc: Ditto.
* lib/crt0.h: Ditto.
* lib/cygwin_attach_dll.c: Ditto.
* lib/cygwin_crt0.c: Ditto.
* lib/dll_entry.cc: Ditto.
* lib/dll_main.cc: Ditto.
* lib/getopt.c: Ditto.
* lib/libcmain.c: Ditto.
* lib/premain0.c: Ditto.
* lib/premain1.c: Ditto.
* lib/premain2.c: Ditto.
* lib/premain3.c: Ditto.
This commit is contained in:
Christopher Faylor 2000-07-01 03:51:55 +00:00
parent 86e25f234a
commit 14a3bc2fa1
26 changed files with 455 additions and 223 deletions

View File

@ -1,3 +1,48 @@
Fri Jun 30 23:21:40 2000 Christopher Faylor <cgf@cygnus.com>
* Makefile.in: Use variables rather than configure constructs where
appropriate.
(LIBCOS): Find additional stub library stuff in their own subdirectory.
* dcrt0.cc: Convert user_data pointer to static __cygwin_user_data
area.
(do_global_ctors): Check magic_bisquit for initialization.
(dll_crt0_1): First group of premain functions prior to fd
initialization. Run second group before calling main.
(dll_crt0 ()): New function, called from new initialization code.
(dll_crt0 (per_process *uptr)): Call new dll_crt0 () function on
initialization.
* debug.cc (thread_stub): Initialize bottom of stack with per-thread
info.
* environ.cc (parse_thing): Use binmode global to control
CYGWIN=binmode behavior.
* fhandler.cc (fhandler_base::open): Allow explicit setting of __fmode
to O_BINARY or O_TEXT to override disk mount settings.
* libcmain.cc: Move to lib subdirectory.
* libccrt0.cc: Ditto.
* dll_main.cc: Ditto.
* dll_entry.cc: Ditto.
* getopt.c: Ditto.
* thread.cc (thread_init_wrapper): Call ExitThread explicitly rather
than returning, as a preliminary step towards placing per thread info
at the bottom of the stack.
* winsup.h: Move per_process class to include/sys/cygwin.h. Declare
new dll_crt0().
* include/cygwin/version.h: Bump API minor version.
* binmode.c: New file.
* textmode.c: Ditto.
* lib/_cygwin_crt0_common.cc: Ditto.
* lib/crt0.h: Ditto.
* lib/cygwin_attach_dll.c: Ditto.
* lib/cygwin_crt0.c: Ditto.
* lib/dll_entry.cc: Ditto.
* lib/dll_main.cc: Ditto.
* lib/getopt.c: Ditto.
* lib/libcmain.c: Ditto.
* lib/premain0.c: Ditto.
* lib/premain1.c: Ditto.
* lib/premain2.c: Ditto.
* lib/premain3.c: Ditto.
Wed Jun 28 19:36:00 2000 Corinna Vinschen <corinna@vinschen.de>
* syscalls.cc (seteuid): Initialize pi.token before calling

View File

@ -9,12 +9,13 @@
# This makefile requires GNU make.
CONFIG_DIR:=@srcdir@/config/@CONFIG_DIR@
SHELL:=@SHELL@
VPATH:=@srcdir@:$(CONFIG_DIR):@srcdir@/regexp
srcdir:=@srcdir@
objdir:=.
CONFIG_DIR:=$(srcdir)/config/@CONFIG_DIR@
VPATH:=$(srcdir):$(CONFIG_DIR):$(srcdir)/regexp:$(srcdir)/lib
target_alias:=@target_alias@
build_alias:=@build_alias@
host_alias:=@host_alias@
@ -106,7 +107,8 @@ GMON_START:=gcrt0.o
# data which apps can get to, which is a pain in the dll, so we
# include them directly into the library.
LIBCOS:=libccrt0.o libcmain.o getopt.o dll_entry.o dll_main.o
LIBCOS:=${sort ${addsuffix .o,${basename ${notdir ${wildcard $(srcdir)/lib/*.c}}}} \
${addsuffix .o,${basename ${notdir ${wildcard $(srcdir)/lib/*.cc}}}}}
# Build all source files in the config directory
@ -143,7 +145,7 @@ install_host=@install_host@
all: new-$(DLL_NAME) $(all_host) all_target
all_target: $(LIBGMON_A) $(LIB_NAME)
all_target: $(LIBGMON_A) $(LIB_NAME) binmode.o textmode.o
all_host: new-$(LIB_NAME) cygrun.exe
@ -151,7 +153,7 @@ force:
install: all $(install_host) $(install_target)
$(INSTALL_DATA) new-$(DLL_NAME) $(bindir)/$(DLL_NAME); \
for i in $(LIB_NAME) $(GMON_START) $(LIBGMON_A) ; do \
for i in $(LIB_NAME) $(GMON_START) $(LIBGMON_A) binmode.o ; do \
$(INSTALL_DATA) $$i $(tooldir)/lib/$$i ; \
done ; \
cd $(srcdir); \

19
winsup/cygwin/binmode.c Normal file
View File

@ -0,0 +1,19 @@
/* binmode.c
Copyright 2000 Red Hat, Inc.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#include <sys/fcntl.h>
extern int _fmode;
void
cygwin_premain0(int argc, char **argv)
{
_fmode &= _O_TEXT;
_fmode |= _O_BINARY;
}

View File

@ -124,6 +124,7 @@ difftime
_difftime = difftime
div
_div = div
dll_crt0@0
dll_crt0__FP11per_process
cygwin_dll_init
dll_dllcrt0
@ -1006,6 +1007,7 @@ getpgid
killpg
pause
__cygwin_environ DATA
__cygwin_user_data DATA
_ctype_ DATA
_sys_errlist DATA
_sys_nerr DATA

View File

@ -19,14 +19,13 @@ details. */
#define MAX_AT_FILE_LEVEL 10
#define PREMAIN_LEN (sizeof(user_data->premain) / sizeof (user_data->premain[0]))
HANDLE NO_COPY hMainProc = NULL;
HANDLE NO_COPY hMainThread = NULL;
sigthread NO_COPY mainthread; // ID of the main thread
static NO_COPY char dummy_user_data[sizeof (per_process)] = {0};
per_process NO_COPY *user_data = (per_process *) &dummy_user_data;
per_thread_waitq NO_COPY waitq_storage;
per_thread_vfork NO_COPY vfork_storage;
per_thread_signal_dispatch NO_COPY signal_dispatch_storage;
@ -56,12 +55,11 @@ extern "C"
which use cygwin.dll. */
char **__cygwin_environ;
/* __progname used in getopt error message */
char *__progname;
char *__progname = NULL;
struct _reent reent_data;
struct per_process __cygwin_user_data;
};
static void dll_crt0_1 ();
char *old_title = NULL;
char title_buf[TITLESIZE + 1];
@ -96,13 +94,12 @@ do_global_ctors (void (**in_pfunc)(), int force)
while (--pfunc > in_pfunc)
(*pfunc) ();
if (user_data != (per_process *) &dummy_user_data)
if (user_data->magic_biscuit == SIZEOF_PER_PROCESS)
atexit (do_global_dtors);
}
/* remember the type of Win32 OS being run for future use. */
os_type NO_COPY os_being_run;
char NO_COPY osname[40];
/* set_os_type: Set global variable os_being_run with type of Win32
@ -576,7 +573,6 @@ dll_crt0_1 ()
be on the stack. */
/* FIXME: Verify forked children get their exception handler set up ok. */
exception_list cygwin_except_entry;
do_global_ctors (&__CTOR_LIST__, 1);
#ifdef DEBUGGING
@ -734,6 +730,10 @@ dll_crt0_1 ()
/* Connect to tty. */
tty_init ();
if (user_data->premain[0])
for (unsigned int i = 0; i < PREMAIN_LEN / 2; i++)
user_data->premain[i] (argc, argv);
/* Set up standard fds in file descriptor table. */
hinfo_init ();
@ -758,13 +758,18 @@ dll_crt0_1 ()
DllList::the().initAll();
set_errno (0);
debug_printf ("user_data->main %p", user_data->main);
/* Flush signals and ensure that signal thread is up and running. Can't
do this for noncygwin case since the signal thread is blocked due to
LoadLibrary serialization. */
sig_send (NULL, __SIGFLUSH); /* also initializes uid, gid */
/* Execute any specified "premain" functions */
if (user_data->premain[0])
for (unsigned int i = PREMAIN_LEN / 2; i < PREMAIN_LEN; i++)
user_data->premain[i] (argc, argv);
debug_printf ("user_data->main %p", user_data->main);
if (user_data->main)
exit (user_data->main (argc, argv, *user_data->envptr));
}
@ -775,12 +780,20 @@ dll_crt0_1 ()
UPTR is a pointer to global data that lives on the libc side of the
line [if one distinguishes the application from the dll]. */
void
dll_crt0 (per_process *uptr)
void __stdcall
dll_crt0 ()
{
char zeros[sizeof (ciresrv->zero)] = {0};
/* Set the local copy of the pointer into the user space. */
user_data = uptr;
#ifdef DEBUGGING
char buf[80];
if (GetEnvironmentVariable ("CYGWIN_SLEEP", buf, sizeof (buf)))
{
small_printf ("Sleeping %d, pid %u\n", atoi (buf), GetCurrentProcessId ());
Sleep (atoi(buf));
}
#endif
user_data->heapbase = user_data->heapptr = user_data->heaptop = NULL;
set_console_handler ();
@ -845,6 +858,15 @@ dll_crt0 (per_process *uptr)
dll_crt0_1 ();
}
void
dll_crt0 (per_process *uptr)
{
/* Set the local copy of the pointer into the user space. */
if (uptr)
*user_data = *uptr;
dll_crt0 ();
}
extern "C" void *export_malloc (unsigned int);
extern "C" void export_free (void *);
extern "C" void *export_realloc (void *, unsigned int);

View File

@ -9,6 +9,7 @@ details. */
#define NO_DEBUG_DEFINES
#include "winsup.h"
#include "exceptions.h"
#include "perthread.h"
static muto NO_COPY *threadname_lock = NULL;
#define lock_threadname() \
@ -82,11 +83,12 @@ thread_stub (VOID *arg)
/* Give up our slot in the start_buf array */
InterlockedExchange (&((thread_start *) arg)->notavail, 0);
/* Initialize this threads ability to respond to things like
/* Initialize this thread's ability to respond to things like
SIGSEGV or SIGFPE. */
init_exceptions (&except_entry);
return threadfunc (threadarg);
set_reent (&reent_data);
ExitThread (threadfunc (threadarg));
}
/* Wrapper for CreateThread. Registers the thread name/id and ensures that

View File

@ -19,6 +19,7 @@ extern BOOL allow_glob;
extern BOOL allow_ntea;
extern BOOL strip_title_path;
extern DWORD chunksize;
extern BOOL binmode;
BOOL threadsafe;
BOOL reset_com = TRUE;
static BOOL envcache = TRUE;
@ -322,7 +323,7 @@ struct parse_thing
} values[2];
} known[] =
{
{"binmode", {&__fmode}, justset, NULL, {{O_TEXT}, {O_BINARY}}},
{"binmode", {&binmode}, justset, NULL, {{FALSE}, {TRUE}}},
{"envcache", {&envcache}, justset, NULL, {{TRUE}, {FALSE}}},
{"error_start", {func: &error_start_init}, isfunc, NULL, {{0}, {0}}},
{"export", {&export_settings}, justset, NULL, {{FALSE}, {TRUE}}},

View File

@ -18,6 +18,8 @@ static NO_COPY const int CHUNK_SIZE = 1024; /* Used for crlf conversions */
static char fhandler_disk_dummy_name[] = "some disk file";
DWORD binmode;
int
fhandler_base::puts_readahead (const char *s, size_t len = (size_t) -1)
{
@ -352,10 +354,14 @@ fhandler_base::open (int flags, mode_t mode)
int bin;
if (flags & (O_BINARY | O_TEXT))
bin = flags & O_TEXT ? 0 : O_BINARY;
else if (__fmode & O_BINARY)
bin = O_BINARY;
else if (__fmode & O_TEXT)
bin = O_TEXT;
else if (get_device () == FH_DISK)
bin = get_w_binary () || get_r_binary ();
else
bin = (__fmode & O_BINARY) || get_w_binary () || get_r_binary ();
bin = binmode || get_w_binary () || get_r_binary ();
set_r_binary (bin);
set_w_binary (bin);

View File

@ -111,10 +111,12 @@ details. */
getuid, getgid return real uid/gid.
seteuid, setegid set only effective uid/gid.
setuid, setgid set effective and real uid/gid.
23: Export new dll_crt0 interface and cygwin_user_data for use
with crt0 startup code.
*/
#define CYGWIN_VERSION_API_MAJOR 0
#define CYGWIN_VERSION_API_MINOR 22
#define CYGWIN_VERSION_API_MINOR 23
/* There is also a compatibity version number associated with the
shared memory regions. It is incremented when incompatible

View File

@ -36,8 +36,105 @@ extern void cygwin_premain1 (int argc, char **argv);
extern void cygwin_premain2 (int argc, char **argv);
extern void cygwin_premain3 (int argc, char **argv);
#ifdef WINVER
#ifdef __cplusplus
/* This lives in the app and is initialized before jumping into the DLL.
It should only contain stuff which the user's process needs to see, or
which is needed before the user pointer is initialized, or is needed to
carry inheritance information from parent to child. Note that it cannot
be used to carry inheritance information across exec!
Remember, this structure is linked into the application's executable.
Changes to this can invalidate existing executables, so we go to extra
lengths to avoid having to do it.
When adding/deleting members, remember to adjust {public,internal}_reserved.
The size of the class shouldn't change [unless you really are prepared to
invalidate all existing executables]. The program does a check (using
SIZEOF_PER_PROCESS) to make sure you remember to make the adjustment.
*/
class per_process
{
public:
char *initial_sp;
/* The offset of these 3 values can never change. */
/* magic_biscuit is the size of this class and should never change. */
unsigned long magic_biscuit;
unsigned long dll_major;
unsigned long dll_minor;
struct _reent **impure_ptr_ptr;
char ***envptr;
/* Used to point to the memory machine we should use. Usually these
point back into the dll, but they can be overridden by the user. */
void *(*malloc)(size_t);
void (*free)(void *);
void *(*realloc)(void *, size_t);
int *fmode_ptr;
int (*main)(int, char **, char **);
void (**ctors)(void);
void (**dtors)(void);
/* For fork */
void *data_start;
void *data_end;
void *bss_start;
void *bss_end;
void *(*calloc)(size_t, size_t);
/* For future expansion of values set by the app. */
void (*premain[4]) (int, char **);
/* The rest are *internal* to cygwin.dll.
Those that are here because we want the child to inherit the value from
the parent (which happens when bss is copied) are marked as such. */
/* non-zero of ctors have been run. Inherited from parent. */
int run_ctors_p;
/* These will be non-zero if the above (malloc,free,realloc) have been
overridden. */
/* FIXME: not currently used */
int __imp_malloc;
int __imp_free;
int __imp_realloc;
/* Heap management. Inherited from parent. */
void *heapbase; /* bottom of the heap */
void *heapptr; /* current index into heap */
void *heaptop; /* current top of heap */
HANDLE unused1; /* unused */
/* Non-zero means the task was forked. The value is the pid.
Inherited from parent. */
int forkee;
HMODULE hmodule;
DWORD api_major; /* API version that this program was */
DWORD api_minor; /* linked with */
/* For future expansion, so apps won't have to be relinked if we
add an item. */
#ifdef _MT_SAFE
ResourceLocks *resourcelocks;
MTinterface *threadinterface;
void *internal_reserved[6];
#else
void *internal_reserved[8];
#endif
};
#endif /* __cplusplus */
#ifdef _PATH_PASSWD
extern HANDLE cygwin_logon_user (const struct passwd *, const char *);
#endif
#ifdef WINVER
extern void cygwin_set_impersonation_token (const HANDLE);
/* included if <windows.h> is included */

View File

@ -0,0 +1,76 @@
/* common.cc: common crt0 function for cygwin crt0's.
Copyright 2000 Cygnus Solutions.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#include "winsup.h"
#include "crt0.h"
#include <reent.h>
#include <stdlib.h>
extern __declspec(dllimport) per_process __cygwin_user_data;
extern "C"
{
char **environ;
void cygwin_crt0 (MainFunc);
int cygwin_attach_dll (HMODULE, MainFunc);
int cygwin_attach_noncygwin_dll (HMODULE, MainFunc);
int main (int, char **, char **);
struct _reent *_impure_ptr;
int _fmode;
/* Set up pointers to various pieces so the dll can then use them,
and then jump to the dll. */
void
_cygwin_crt0_common (MainFunc f)
{
/* This is used to record what the initial sp was. The value is needed
when copying the parent's stack to the child during a fork. */
int onstack;
/* The version numbers are the main source of compatibility checking.
As a backup to them, we use the size of the per_process struct. */
__cygwin_user_data.magic_biscuit = sizeof (per_process);
/* cygwin.dll version number in effect at the time the app was created. */
__cygwin_user_data.dll_major = CYGWIN_VERSION_DLL_MAJOR;
__cygwin_user_data.dll_minor = CYGWIN_VERSION_DLL_MINOR;
__cygwin_user_data.api_major = CYGWIN_VERSION_API_MAJOR;
__cygwin_user_data.api_minor = CYGWIN_VERSION_API_MINOR;
__cygwin_user_data.ctors = &__CTOR_LIST__;
__cygwin_user_data.dtors = &__DTOR_LIST__;
__cygwin_user_data.envptr = &environ;
__cygwin_user_data.impure_ptr_ptr = &_impure_ptr;
__cygwin_user_data.main = f;
__cygwin_user_data.premain[0] = cygwin_premain0;
__cygwin_user_data.premain[1] = cygwin_premain1;
__cygwin_user_data.premain[2] = cygwin_premain2;
__cygwin_user_data.premain[3] = cygwin_premain3;
__cygwin_user_data.fmode_ptr = &_fmode;
__cygwin_user_data.initial_sp = (char *) &onstack;
/* Remember whatever the user linked his application with - or
point to entries in the dll. */
__cygwin_user_data.malloc = &malloc;
__cygwin_user_data.free = &free;
__cygwin_user_data.realloc = &realloc;
__cygwin_user_data.calloc = &calloc;
/* Setup the module handle so fork can get the path name. */
__cygwin_user_data.hmodule = GetModuleHandle (0);
/* variables for fork */
__cygwin_user_data.data_start = &_data_start__;
__cygwin_user_data.data_end = &_data_end__;
__cygwin_user_data.bss_start = &_bss_start__;
__cygwin_user_data.bss_end = &_bss_end__;
}
} /* "C" */

22
winsup/cygwin/lib/crt0.h Normal file
View File

@ -0,0 +1,22 @@
/* crt0.h: header file for crt0.
Copyright 2000 Cygnus Solutions.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#ifdef __cplusplus
extern "C" {
#endif
struct per_process;
typedef int (*MainFunc) (int argc, char *argv[], char **env);
void _cygwin_crt0_common (MainFunc);
int dll_dllcrt0 (HMODULE, struct per_process *);
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,22 @@
/* attach_dll.cc: crt0 for attaching cygwin DLL from a non-cygwin app.
Copyright 2000 Cygnus Solutions.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#include <windows.h>
#include "crt0.h"
/* for a loaded dll */
int
cygwin_attach_dll (HMODULE h, MainFunc f)
{
_cygwin_crt0_common (f);
/* jump into the dll. */
return dll_dllcrt0 (h, NULL);
}

View File

@ -0,0 +1,24 @@
/* crt0.cc: crt0 for libc
Copyright 2000 Cygnus Solutions.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#include <windows.h>
#include "crt0.h"
extern void __stdcall dll_crt0 (void) __declspec (dllimport);
/* for main module */
void
cygwin_crt0 (MainFunc f)
{
_cygwin_crt0_common (f);
/* Jump into the dll. */
dll_crt0 ();
}

View File

@ -39,4 +39,3 @@ DllMain (
}
return TRUE;
}

View File

@ -1,6 +1,6 @@
/* libcmain.cc
/* libcmain.c
Copyright 1996, 1997, 1998 Cygnus Solutions.
Copyright 1996, 1997, 1998, 2000 Cygnus Solutions.
This file is part of Cygwin.
@ -11,7 +11,8 @@ details. */
#include <windows.h>
/* Allow apps which don't have a main work, as long as they define WinMain */
extern "C" int main ()
int
main ()
{
HMODULE x = GetModuleHandleA(0);
char *s = GetCommandLineA ();
@ -27,8 +28,8 @@ extern "C" int main ()
GetStartupInfo (&si);
WinMain (x, 0, s,
((si.dwFlags & STARTF_USESHOWWINDOW) != 0
? si.wShowWindow
: SW_SHOWNORMAL));
return WinMain (x, 0, s,
((si.dwFlags & STARTF_USESHOWWINDOW) != 0
? si.wShowWindow
: SW_SHOWNORMAL));
}

View File

@ -0,0 +1,14 @@
/* premain0.c
Copyright 2000 Red Hat, Inc.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
void
cygwin_premain0(int argc, char **argv)
{
}

View File

@ -0,0 +1,14 @@
/* premain1.c
Copyright 2000 Red Hat, Inc.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
void
cygwin_premain1(int argc, char **argv)
{
}

View File

@ -0,0 +1,14 @@
/* premain2.c
Copyright 2000 Red Hat, Inc.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
void
cygwin_premain2(int argc, char **argv)
{
}

View File

@ -0,0 +1,14 @@
/* premain3.c
Copyright 2000 Red Hat, Inc.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
void
cygwin_premain3(int argc, char **argv)
{
}

View File

@ -1,95 +0,0 @@
/* libccrt0.cc: crt0 for libc [newlib calls this one]
Copyright 1996, 1998, 1999, 2000 Cygnus Solutions.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#undef MALLOC_DEBUG
#include "winsup.h"
#include <reent.h>
#include <stdlib.h>
typedef int (*MainFunc) (int argc, char *argc[], char **env);
extern "C"
{
char **environ;
void cygwin_crt0 (MainFunc);
int cygwin_attach_dll (HMODULE, MainFunc);
int cygwin_attach_noncygwin_dll (HMODULE, MainFunc);
int main (int, char **, char **);
struct _reent *_impure_ptr;
int _fmode;
};
static per_process this_proc;
/* Set up pointers to various pieces so the dll can then use them,
and then jump to the dll. */
static void
cygwin_crt0_common (MainFunc f)
{
/* This is used to record what the initial sp was. The value is needed
when copying the parent's stack to the child during a fork. */
int onstack;
/* The version numbers are the main source of compatibility checking.
As a backup to them, we use the size of the per_process struct. */
this_proc.magic_biscuit = sizeof (per_process);
/* cygwin.dll version number in effect at the time the app was created. */
this_proc.dll_major = CYGWIN_VERSION_DLL_MAJOR;
this_proc.dll_minor = CYGWIN_VERSION_DLL_MINOR;
this_proc.api_major = CYGWIN_VERSION_API_MAJOR;
this_proc.api_minor = CYGWIN_VERSION_API_MINOR;
this_proc.ctors = &__CTOR_LIST__;
this_proc.dtors = &__DTOR_LIST__;
this_proc.envptr = &environ;
this_proc.impure_ptr_ptr = &_impure_ptr;
this_proc.main = f;
this_proc.fmode_ptr = &_fmode;
this_proc.initial_sp = (char *) &onstack;
/* Remember whatever the user linked his application with - or
point to entries in the dll. */
this_proc.malloc = &malloc;
this_proc.free = &free;
this_proc.realloc = &realloc;
this_proc.calloc = &calloc;
/* Setup the module handle so fork can get the path name. */
this_proc.hmodule = GetModuleHandle (0);
/* variables for fork */
this_proc.data_start = &_data_start__;
this_proc.data_end = &_data_end__;
this_proc.bss_start = &_bss_start__;
this_proc.bss_end = &_bss_end__;
}
/* for main module */
void
cygwin_crt0 (MainFunc f)
{
cygwin_crt0_common (f);
/* Jump into the dll. */
dll_crt0 (&this_proc);
}
/* for a loaded dll */
int
cygwin_attach_dll (HMODULE h, MainFunc f)
{
cygwin_crt0_common (f);
/* jump into the dll. */
return dll_dllcrt0 (h, &this_proc);
}

19
winsup/cygwin/textmode.c Normal file
View File

@ -0,0 +1,19 @@
/* binmode.c
Copyright 2000 Red Hat, Inc.
This file is part of Cygwin.
This software is a copyrighted work licensed under the terms of the
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
details. */
#include <sys/fcntl.h>
extern int _fmode;
void
cygwin_premain0(int argc, char **argv)
{
_fmode &= _O_BINARY;
_fmode |= _O_TEXT;
}

View File

@ -524,7 +524,7 @@ thread_init_wrapper (void *_arg)
// thread->used = false; // release thread entry
thread->return_ptr = ret;
return ret;
ExitThread (0);
}
int

View File

@ -93,99 +93,8 @@ extern HANDLE hMainProc;
/********************** Application Interface **************************/
/* This lives in the app and is initialized before jumping into the DLL.
It should only contain stuff which the user's process needs to see, or
which is needed before the user pointer is initialized, or is needed to
carry inheritance information from parent to child. Note that it cannot
be used to carry inheritance information across exec!
Remember, this structure is linked into the application's executable.
Changes to this can invalidate existing executables, so we go to extra
lengths to avoid having to do it.
When adding/deleting members, remember to adjust {public,internal}_reserved.
The size of the class shouldn't change [unless you really are prepared to
invalidate all existing executables]. The program does a check (using
SIZEOF_PER_PROCESS) to make sure you remember to make the adjustment.
*/
class per_process
{
public:
char *initial_sp;
/* The offset of these 3 values can never change. */
/* magic_biscuit is the size of this class and should never change. */
DWORD magic_biscuit;
DWORD dll_major;
DWORD dll_minor;
struct _reent **impure_ptr_ptr;
char ***envptr;
/* Used to point to the memory machine we should use. Usually these
point back into the dll, but they can be overridden by the user. */
void *(*malloc)(size_t);
void (*free)(void *);
void *(*realloc)(void *, size_t);
int *fmode_ptr;
int (*main)(int, char **, char **);
void (**ctors)(void);
void (**dtors)(void);
/* For fork */
void *data_start;
void *data_end;
void *bss_start;
void *bss_end;
void *(*calloc)(size_t, size_t);
/* For future expansion of values set by the app. */
void (*premain[4]) (int, char **);
/* The rest are *internal* to cygwin.dll.
Those that are here because we want the child to inherit the value from
the parent (which happens when bss is copied) are marked as such. */
/* non-zero of ctors have been run. Inherited from parent. */
int run_ctors_p;
/* These will be non-zero if the above (malloc,free,realloc) have been
overridden. */
/* FIXME: not currently used */
int __imp_malloc;
int __imp_free;
int __imp_realloc;
/* Heap management. Inherited from parent. */
void *heapbase; /* bottom of the heap */
void *heapptr; /* current index into heap */
void *heaptop; /* current top of heap */
HANDLE unused1; /* unused */
/* Non-zero means the task was forked. The value is the pid.
Inherited from parent. */
int forkee;
HMODULE hmodule;
DWORD api_major; /* API version that this program was */
DWORD api_minor; /* linked with */
/* For future expansion, so apps won't have to be relinked if we
add an item. */
#ifdef _MT_SAFE
ResourceLocks *resourcelocks;
MTinterface *threadinterface;
void *internal_reserved[6];
#else
void *internal_reserved[8];
#endif
};
extern per_process *user_data; /* Pointer into application's static data */
extern "C" per_process __cygwin_user_data; /* Pointer into application's static data */
#define user_data (&__cygwin_user_data)
/* We use the following to test that sizeof hasn't changed. When adding
or deleting members, insert fillers or use the reserved entries.
@ -363,9 +272,10 @@ extern unsigned int signal_shift_subtract;
/* cygwin .dll initialization */
void dll_crt0 (per_process *);
void __stdcall dll_crt0 () __asm__ ("dll_crt0");
/* dynamically loaded dll initialization */
extern "C" int dll_dllcrt0 (HMODULE,per_process*);
extern "C" int dll_dllcrt0 (HMODULE, per_process*);
/* dynamically loaded dll initialization for non-cygwin apps */
extern "C" int dll_noncygwin_dllcrt0 (HMODULE, per_process *);