* Makefile.in: Autogenerate some header files which provide magic numbers.
Force dependencies for files which depend on autogenerated headers to ensure that they are always built. * child_info.h (child_info): Add new fields to accommodate new magic number header stuff. * dcrt0.cc: Rely on "child_info_magic.h" to ensure that correct child_info magic numbers are used. (dll_crt0_1): Temporarily remove _cygwin_testing_magic test. (_dll_crt0): Do more testing on magic numbers from fork_info structure. Call "multiple_cygwin_problem" where appropriate. (multiple_cygwin_problem): Rename from multiple_cygwin_die. Issue a warning or die, as appropriate based on cygwin version/magic number mismatch. * pinfo.cc (pinfo::exit): Don't attempt to dereference `this' if it doesn't exist. This can happen when a fatal error occurs early in process initialization. * shared.cc: Rely on "shared_info_magic.h" to accommodate that new magic number header stuff. (shared_info::initialize): Use new magic number stuff, for shared region. (memory_init): Ditto, for mount table. * shared_info.h: Accomodate new magic number stuff for shared region and mount table. * sigproc.cc: Rely on "child_info_magic.h" to accommodate new magic number header stuff. (init_child_info): Initialize new fields in child_info) to accomodate magic numbers. * winsup.h: Rename multiple_cygwin_die to multiple_cygwin_problem. * include/cygwin/version.h: Define macros for manipulating version magic. * cygmagic: New shell script for generating magic numbers.
This commit is contained in:
parent
f6eff1c046
commit
77f4a25028
@ -1,3 +1,37 @@
|
|||||||
|
2001-12-25 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
|
* Makefile.in: Autogenerate some header files which provide magic
|
||||||
|
numbers. Force dependencies for files which depend on autogenerated
|
||||||
|
headers to ensure that they are always built.
|
||||||
|
* child_info.h (child_info): Add new fields to accommodate new magic
|
||||||
|
number header stuff.
|
||||||
|
* dcrt0.cc: Rely on "child_info_magic.h" to ensure that correct
|
||||||
|
child_info magic numbers are used.
|
||||||
|
(dll_crt0_1): Temporarily remove _cygwin_testing_magic test.
|
||||||
|
(_dll_crt0): Do more testing on magic numbers from fork_info structure.
|
||||||
|
Call "multiple_cygwin_problem" where appropriate.
|
||||||
|
(multiple_cygwin_problem): Rename from multiple_cygwin_die. Issue a
|
||||||
|
warning or die, as appropriate based on cygwin version/magic number
|
||||||
|
mismatch.
|
||||||
|
* pinfo.cc (pinfo::exit): Don't attempt to dereference `this' if it
|
||||||
|
doesn't exist. This can happen when a fatal error occurs early in
|
||||||
|
process initialization.
|
||||||
|
* shared.cc: Rely on "shared_info_magic.h" to accommodate that new
|
||||||
|
magic number header stuff.
|
||||||
|
(shared_info::initialize): Use new magic number stuff, for shared
|
||||||
|
region.
|
||||||
|
(memory_init): Ditto, for mount table.
|
||||||
|
* shared_info.h: Accomodate new magic number stuff for shared region
|
||||||
|
and mount table.
|
||||||
|
* sigproc.cc: Rely on "child_info_magic.h" to accommodate new magic
|
||||||
|
number header stuff.
|
||||||
|
(init_child_info): Initialize new fields in child_info) to accomodate
|
||||||
|
magic numbers.
|
||||||
|
* winsup.h: Rename multiple_cygwin_die to multiple_cygwin_problem.
|
||||||
|
* include/cygwin/version.h: Define macros for manipulating version
|
||||||
|
magic.
|
||||||
|
* cygmagic: New shell script for generating magic numbers.
|
||||||
|
|
||||||
2001-12-20 Christopher Faylor <cgf@redhat.com>
|
2001-12-20 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
* include/cygwin/version.h: Bump API minor version for below changes.
|
* include/cygwin/version.h: Bump API minor version for below changes.
|
||||||
|
@ -51,7 +51,7 @@ CC:=@CC@
|
|||||||
# FIXME: Which is it, CC or CC_FOR_TARGET?
|
# FIXME: Which is it, CC or CC_FOR_TARGET?
|
||||||
CC_FOR_TARGET:=$(CC)
|
CC_FOR_TARGET:=$(CC)
|
||||||
CFLAGS:=@CFLAGS@
|
CFLAGS:=@CFLAGS@
|
||||||
CFLAGS+=-MD -fbuiltin
|
CFLAGS+=-MMD -fbuiltin
|
||||||
CXX:=@CXX@
|
CXX:=@CXX@
|
||||||
CXXFLAGS:=@CXXFLAGS@
|
CXXFLAGS:=@CXXFLAGS@
|
||||||
|
|
||||||
@ -230,6 +230,16 @@ $(LIBGMON_A): $(GMON_OFILES) $(GMON_START)
|
|||||||
version.cc winver.o: winver_stamp
|
version.cc winver.o: winver_stamp
|
||||||
@ :
|
@ :
|
||||||
|
|
||||||
|
shared_info_magic.h: cygmagic shared_info.h
|
||||||
|
/bin/sh ${word 1,$^} $@ $(CC) ${word 2,$^} MOUNT_MAGIC 'class mount_info' SHARED_MAGIC 'class shared_info'
|
||||||
|
|
||||||
|
child_info_magic.h: cygmagic child_info.h
|
||||||
|
/bin/sh ${word 1,$^} $@ $(CC) ${word 2,$^} CHILD_INFO_MAGIC 'class child_info'
|
||||||
|
|
||||||
|
dcrt0.o sigproc.o: child_info_magic.h
|
||||||
|
|
||||||
|
shared.o: shared_info_magic.h
|
||||||
|
|
||||||
winver_stamp: mkvers.sh include/cygwin/version.h winver.rc $(DLL_OFILES)
|
winver_stamp: mkvers.sh include/cygwin/version.h winver.rc $(DLL_OFILES)
|
||||||
@echo "Making version.o and winver.o";\
|
@echo "Making version.o and winver.o";\
|
||||||
$(SHELL) ${word 1,$^} ${word 2,$^} ${word 3,$^} $(WINDRES) && \
|
$(SHELL) ${word 1,$^} ${word 2,$^} ${word 3,$^} $(WINDRES) && \
|
||||||
@ -240,8 +250,6 @@ cygrun.exe : cygrun.o $(LIB_NAME) $(w32api_lib)/libuser32.a \
|
|||||||
$(w32api_lib)/libshell32.a $(w32api_lib)/libkernel32.a
|
$(w32api_lib)/libshell32.a $(w32api_lib)/libkernel32.a
|
||||||
$(CC) -nodefaultlibs -o $@ $^
|
$(CC) -nodefaultlibs -o $@ $^
|
||||||
|
|
||||||
#
|
|
||||||
|
|
||||||
Makefile: cygwin.din
|
Makefile: cygwin.din
|
||||||
|
|
||||||
$(DEF_FILE): cygwin.din config.status
|
$(DEF_FILE): cygwin.din config.status
|
||||||
|
@ -12,28 +12,32 @@ details. */
|
|||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PROC_MAGIC = 0xaf12f000,
|
_PROC_EXEC,
|
||||||
_PROC_EXEC = PROC_MAGIC + 2,
|
_PROC_SPAWN,
|
||||||
_PROC_SPAWN = PROC_MAGIC + 3,
|
_PROC_FORK
|
||||||
_PROC_FORK = PROC_MAGIC + 4, // Newer versions provide stack
|
|
||||||
// location information
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define PROC_MAGIC_MASK 0xff00f000
|
#define OPROC_MAGIC_MASK 0xff00ff00
|
||||||
#define PROC_MAGIC_GENERIC 0xaf00f000
|
#define OPROC_MAGIC_GENERIC 0xaf00f000
|
||||||
#define PROC_MAGIC_VER_MASK 0x0ff0000
|
|
||||||
|
|
||||||
#define PROC_EXEC (_PROC_EXEC + _cygwin_testing_magic)
|
#define PROC_MAGIC_GENERIC 0xaf00fa00
|
||||||
#define PROC_SPAWN (_PROC_SPAWN + _cygwin_testing_magic)
|
|
||||||
#define PROC_FORK (_PROC_FORK + _cygwin_testing_magic)
|
#define PROC_EXEC (_PROC_EXEC)
|
||||||
|
#define PROC_SPAWN (_PROC_SPAWN)
|
||||||
|
#define PROC_FORK (_PROC_FORK)
|
||||||
|
|
||||||
#define EXEC_MAGIC_SIZE sizeof(child_info)
|
#define EXEC_MAGIC_SIZE sizeof(child_info)
|
||||||
|
|
||||||
|
#define CURR_CHILD_INFO_MAGIC 0xba17
|
||||||
|
|
||||||
class child_info
|
class child_info
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DWORD zero[4]; // must be zeroed
|
DWORD zero[4]; // must be zeroed
|
||||||
DWORD cb; // size of this record
|
DWORD cb; // size of this record
|
||||||
DWORD type; // type of record
|
DWORD intro; // improbable string
|
||||||
|
unsigned short magic; // magic number unique to child_info
|
||||||
|
unsigned short type; // type of record, exec, spawn, fork
|
||||||
int cygpid; // cygwin pid of child process
|
int cygpid; // cygwin pid of child process
|
||||||
HANDLE subproc_ready; // used for synchronization with parent
|
HANDLE subproc_ready; // used for synchronization with parent
|
||||||
HANDLE mount_h;
|
HANDLE mount_h;
|
||||||
|
20
winsup/cygwin/cygmagic
Executable file
20
winsup/cygwin/cygmagic
Executable file
@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
file_magic=$1; shift
|
||||||
|
gcc=$1; shift
|
||||||
|
file=$1; shift
|
||||||
|
trap "rm -f /tmp/$$.magic" 0 1 2 15
|
||||||
|
cat <<EOF > $file_magic
|
||||||
|
/* autogenerated - do not edit */
|
||||||
|
#include "$file"
|
||||||
|
EOF
|
||||||
|
while [ -n "$1" ]; do
|
||||||
|
define=$1; shift
|
||||||
|
struct=$1; shift
|
||||||
|
sum=`$gcc -E $file | sed -n "/^$struct/,/^};/p" | sed -e 's/[ ]//g' -e '/^$/d' | sum | awk '{print "obase=16;\"0x\";", $1}' | bc | tr '[A-Z]' '[a-z]'`
|
||||||
|
echo "#define $define $sum"
|
||||||
|
curr=`sed -n "s/^#[ ]*define CURR_$define[ ][ ]*\([^ ][^ ]*\)/\1/p" $file`
|
||||||
|
[ "$curr" == "$sum" ] || echo "*** WARNING WARNING WARNING WARNING WARNING ***
|
||||||
|
*** $file: magic number changed old $curr != new $sum
|
||||||
|
*** WARNING WARNING WARNING WARNING WARNING ***" 1>&2
|
||||||
|
done >> $file_magic
|
||||||
|
exit 0
|
@ -30,7 +30,7 @@ details. */
|
|||||||
#include "path.h"
|
#include "path.h"
|
||||||
#include "dtable.h"
|
#include "dtable.h"
|
||||||
#include "cygheap.h"
|
#include "cygheap.h"
|
||||||
#include "child_info.h"
|
#include "child_info_magic.h"
|
||||||
#include "perthread.h"
|
#include "perthread.h"
|
||||||
#include "shared_info.h"
|
#include "shared_info.h"
|
||||||
#include "cygwin_version.h"
|
#include "cygwin_version.h"
|
||||||
@ -585,7 +585,7 @@ dll_crt0_1 ()
|
|||||||
|
|
||||||
if (child_proc_info)
|
if (child_proc_info)
|
||||||
{
|
{
|
||||||
switch (child_proc_info->type - _cygwin_testing_magic)
|
switch (child_proc_info->type)
|
||||||
{
|
{
|
||||||
case _PROC_FORK:
|
case _PROC_FORK:
|
||||||
cygheap_fixup_in_child (child_proc_info, 0);
|
cygheap_fixup_in_child (child_proc_info, 0);
|
||||||
@ -826,7 +826,12 @@ _dll_crt0 ()
|
|||||||
if (si.cbReserved2 >= EXEC_MAGIC_SIZE &&
|
if (si.cbReserved2 >= EXEC_MAGIC_SIZE &&
|
||||||
memcmp (fork_info->zero, zeros, sizeof (zeros)) == 0)
|
memcmp (fork_info->zero, zeros, sizeof (zeros)) == 0)
|
||||||
{
|
{
|
||||||
switch (fork_info->type - _cygwin_testing_magic)
|
if ((fork_info->intro & OPROC_MAGIC_MASK) == OPROC_MAGIC_GENERIC)
|
||||||
|
multiple_cygwin_problem ("proc", fork_info->intro, 0);
|
||||||
|
else if (fork_info->intro == PROC_MAGIC_GENERIC
|
||||||
|
&& fork_info->magic != CHILD_INFO_MAGIC)
|
||||||
|
multiple_cygwin_problem ("proc", fork_info->magic, CHILD_INFO_MAGIC);
|
||||||
|
switch (fork_info->type)
|
||||||
{
|
{
|
||||||
case _PROC_FORK:
|
case _PROC_FORK:
|
||||||
user_data->forkee = fork_info->cygpid;
|
user_data->forkee = fork_info->cygpid;
|
||||||
@ -841,10 +846,8 @@ _dll_crt0 ()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
if (_cygwin_testing)
|
system_printf ("unknown exec type %d", fork_info->type);
|
||||||
fork_info = NULL;
|
fork_info = NULL;
|
||||||
else if ((fork_info->type & PROC_MAGIC_MASK) == PROC_MAGIC_GENERIC)
|
|
||||||
multiple_cygwin_die ();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1020,14 +1023,19 @@ __api_fatal (const char *fmt, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
multiple_cygwin_die ()
|
multiple_cygwin_problem (const char *what, unsigned magic_version, unsigned version)
|
||||||
{
|
{
|
||||||
api_fatal ("\
|
if (CYGWIN_VERSION_MAGIC_VERSION (magic_version) != version)
|
||||||
|
api_fatal ("%s version mismatch detected - %p/%p.\n\
|
||||||
You have multiple copies of cygwin1.dll on your system.\n\
|
You have multiple copies of cygwin1.dll on your system.\n\
|
||||||
Search for cygwin1.dll using the Windows Start->Find/Search facility\n\
|
Search for cygwin1.dll using the Windows Start->Find/Search facility\n\
|
||||||
and delete all but the most recent version. This will probably be\n\
|
and delete all but the most recent version. The most recent version *should*\n\
|
||||||
the one that resides in x:\\cygwin\\bin, where 'x' is the drive on which\n\
|
reside in x:\\cygwin\\bin, where 'x' is the drive on which you have\n\
|
||||||
you have installed the cygwin distribution.\n");
|
installed the cygwin distribution.", what, magic_version, version);
|
||||||
|
|
||||||
|
char buf[1024];
|
||||||
|
if (!GetEnvironmentVariable ("CYGWIN_MISMATCH_OK", buf, sizeof (buf)))
|
||||||
|
system_printf ("%s magic number mismatch detected - %p/%p", what, magic_version, version);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUGGING
|
#ifdef DEBUGGING
|
||||||
|
@ -148,6 +148,8 @@ details. */
|
|||||||
48: Export "posix" regex functions
|
48: Export "posix" regex functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
|
||||||
|
|
||||||
#define CYGWIN_VERSION_API_MAJOR 0
|
#define CYGWIN_VERSION_API_MAJOR 0
|
||||||
#define CYGWIN_VERSION_API_MINOR 48
|
#define CYGWIN_VERSION_API_MINOR 48
|
||||||
|
|
||||||
@ -214,3 +216,5 @@ details. */
|
|||||||
cygwin_internal (CW_GETVERSIONINFO).
|
cygwin_internal (CW_GETVERSIONINFO).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define CYGWIN_VERSION_MAGIC(a, b) ((unsigned) (((unsigned short) a) | (unsigned short) b))
|
||||||
|
#define CYGWIN_VERSION_MAGIC_VERSION(a) ((unsigned) ((unsigned)a & 0xffff))
|
||||||
|
@ -117,14 +117,17 @@ pinfo_init (char **envp, int envc)
|
|||||||
void
|
void
|
||||||
_pinfo::exit (UINT n, bool norecord)
|
_pinfo::exit (UINT n, bool norecord)
|
||||||
{
|
{
|
||||||
if (!norecord)
|
if (this)
|
||||||
process_state = PID_EXITED;
|
{
|
||||||
|
if (!norecord)
|
||||||
|
process_state = PID_EXITED;
|
||||||
|
|
||||||
/* FIXME: There is a potential race between an execed process and its
|
/* FIXME: There is a potential race between an execed process and its
|
||||||
parent here. I hated to add a mutex just for this, though. */
|
parent here. I hated to add a mutex just for this, though. */
|
||||||
struct rusage r;
|
struct rusage r;
|
||||||
fill_rusage (&r, hMainProc);
|
fill_rusage (&r, hMainProc);
|
||||||
add_rusage (&rusage_self, &r);
|
add_rusage (&rusage_self, &r);
|
||||||
|
}
|
||||||
|
|
||||||
sigproc_printf ("Calling ExitProcess %d", n);
|
sigproc_printf ("Calling ExitProcess %d", n);
|
||||||
ExitProcess (n);
|
ExitProcess (n);
|
||||||
|
@ -25,13 +25,10 @@ details. */
|
|||||||
#include "cygerrno.h"
|
#include "cygerrno.h"
|
||||||
#include "cygheap.h"
|
#include "cygheap.h"
|
||||||
#include "heap.h"
|
#include "heap.h"
|
||||||
#include "shared_info.h"
|
#include "shared_info_magic.h"
|
||||||
#include "registry.h"
|
#include "registry.h"
|
||||||
#include "cygwin_version.h"
|
#include "cygwin_version.h"
|
||||||
|
|
||||||
#define SHAREDVER (unsigned)(cygwin_version.api_major << 16 | \
|
|
||||||
cygwin_version.api_minor)
|
|
||||||
|
|
||||||
shared_info NO_COPY *cygwin_shared = NULL;
|
shared_info NO_COPY *cygwin_shared = NULL;
|
||||||
mount_info NO_COPY *mount_table = NULL;
|
mount_info NO_COPY *mount_table = NULL;
|
||||||
HANDLE cygwin_mount_h;
|
HANDLE cygwin_mount_h;
|
||||||
@ -108,8 +105,8 @@ shared_info::initialize ()
|
|||||||
{
|
{
|
||||||
if (inited)
|
if (inited)
|
||||||
{
|
{
|
||||||
if (inited != SHAREDVER)
|
if (inited != SHARED_VERSION_MAGIC)
|
||||||
multiple_cygwin_die ();
|
multiple_cygwin_problem ("shared", inited, SHARED_VERSION);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,7 +115,7 @@ shared_info::initialize ()
|
|||||||
|
|
||||||
/* Initialize tty table. */
|
/* Initialize tty table. */
|
||||||
tty.init ();
|
tty.init ();
|
||||||
inited = SHAREDVER;
|
inited = SHARED_VERSION_MAGIC;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __stdcall
|
void __stdcall
|
||||||
@ -163,12 +160,12 @@ memory_init ()
|
|||||||
/* Initialize the Cygwin per-user mount table, if necessary */
|
/* Initialize the Cygwin per-user mount table, if necessary */
|
||||||
if (!mount_table->version)
|
if (!mount_table->version)
|
||||||
{
|
{
|
||||||
mount_table->version = MOUNT_VERSION;
|
mount_table->version = MOUNT_VERSION_MAGIC;
|
||||||
debug_printf ("initializing mount table");
|
debug_printf ("initializing mount table");
|
||||||
mount_table->init (); /* Initialize the mount table. */
|
mount_table->init (); /* Initialize the mount table. */
|
||||||
}
|
}
|
||||||
else if (mount_table->version != MOUNT_VERSION)
|
else if (mount_table->version != MOUNT_VERSION_MAGIC)
|
||||||
multiple_cygwin_die ();
|
multiple_cygwin_problem ("mount", mount_table->version, MOUNT_VERSION);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,7 +40,9 @@ class mount_item
|
|||||||
scheme should be satisfactory for a long while yet. */
|
scheme should be satisfactory for a long while yet. */
|
||||||
#define MAX_MOUNTS 30
|
#define MAX_MOUNTS 30
|
||||||
|
|
||||||
#define MOUNT_VERSION 27 // increment when mount table changes
|
#define MOUNT_VERSION 27 // increment when mount table changes and
|
||||||
|
#define MOUNT_VERSION_MAGIC CYGWIN_VERSION_MAGIC (MOUNT_MAGIC, MOUNT_VERSION)
|
||||||
|
#define CURR_MOUNT_MAGIC 0xfe35
|
||||||
|
|
||||||
class reg_key;
|
class reg_key;
|
||||||
class mount_info
|
class mount_info
|
||||||
@ -128,6 +130,12 @@ public:
|
|||||||
/******** Shared Info ********/
|
/******** Shared Info ********/
|
||||||
/* Data accessible to all tasks */
|
/* Data accessible to all tasks */
|
||||||
|
|
||||||
|
#define SHARED_VERSION (unsigned)(cygwin_version.api_major << 8 | \
|
||||||
|
cygwin_version.api_minor)
|
||||||
|
#define SHARED_VERSION_MAGIC CYGWIN_VERSION_MAGIC (SHARED_MAGIC, SHARED_VERSION)
|
||||||
|
|
||||||
|
#define CURR_SHARED_MAGIC 0x6f6e
|
||||||
|
|
||||||
class shared_info
|
class shared_info
|
||||||
{
|
{
|
||||||
DWORD inited;
|
DWORD inited;
|
||||||
|
@ -26,7 +26,7 @@ details. */
|
|||||||
#include "path.h"
|
#include "path.h"
|
||||||
#include "dtable.h"
|
#include "dtable.h"
|
||||||
#include "cygheap.h"
|
#include "cygheap.h"
|
||||||
#include "child_info.h"
|
#include "child_info_magic.h"
|
||||||
#define NEED_VFORK
|
#define NEED_VFORK
|
||||||
#include "perthread.h"
|
#include "perthread.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@ -858,6 +858,8 @@ init_child_info (DWORD chtype, child_info *ch, pid_t pid, HANDLE subproc_ready)
|
|||||||
{
|
{
|
||||||
memset (ch, 0, sizeof *ch);
|
memset (ch, 0, sizeof *ch);
|
||||||
ch->cb = sizeof *ch;
|
ch->cb = sizeof *ch;
|
||||||
|
ch->intro = PROC_MAGIC_GENERIC;
|
||||||
|
ch->magic = CHILD_INFO_MAGIC;
|
||||||
ch->type = chtype;
|
ch->type = chtype;
|
||||||
ch->cygpid = pid;
|
ch->cygpid = pid;
|
||||||
ch->subproc_ready = subproc_ready;
|
ch->subproc_ready = subproc_ready;
|
||||||
|
@ -217,7 +217,7 @@ extern bool wsock_started;
|
|||||||
extern "C" void __api_fatal (const char *, ...) __attribute__ ((noreturn));
|
extern "C" void __api_fatal (const char *, ...) __attribute__ ((noreturn));
|
||||||
extern "C" int __small_sprintf (char *dst, const char *fmt, ...) /*__attribute__ ((regparm (2)))*/;
|
extern "C" int __small_sprintf (char *dst, const char *fmt, ...) /*__attribute__ ((regparm (2)))*/;
|
||||||
extern "C" int __small_vsprintf (char *dst, const char *fmt, va_list ap) /*__attribute__ ((regparm (3)))*/;
|
extern "C" int __small_vsprintf (char *dst, const char *fmt, va_list ap) /*__attribute__ ((regparm (3)))*/;
|
||||||
extern void multiple_cygwin_die () __attribute__ ((noreturn));
|
extern void multiple_cygwin_problem (const char *, unsigned, unsigned);
|
||||||
|
|
||||||
extern "C" void __malloc_lock (struct _reent *);
|
extern "C" void __malloc_lock (struct _reent *);
|
||||||
extern "C" void __malloc_unlock (struct _reent *);
|
extern "C" void __malloc_unlock (struct _reent *);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user