New tool: crossreport

Richard W.M. Jones rjones at redhat.com
Wed Feb 11 11:27:16 UTC 2009


Inspired by the discussion a few days ago about APIs, I've written a
tool which you can use to analyze your Linux binaries, find out what
APIs they are using, and generate a report.  Hopefully people can use
this report to estimate how much work they need to do in order to port
their programs.

Two example reports are attached, from virt-viewer and inkscape.

There is no RPM yet because my Rawhide machine is currently doing RHEL
virt testing.  For now you have to build the package yourself from the
Mercurial repository:

http://hg.et.redhat.com/cgi-bin/hg-misc.cgi/fedora-mingw--devel/file/tip/crossreport

Rich.

-- 
Richard Jones, Emerging Technologies, Red Hat  http://et.redhat.com/~rjones
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine.  Supports Linux and Windows.
http://et.redhat.com/~rjones/virt-df/
-------------- next part --------------
Cross-compilation report for: /usr/bin/virt-viewer

Report prepared on Wed Feb 11 11:15:25 2009.
Symbol database last updated on Wed Feb 11 10:23:49 2009 (0 days ago).

This table shows the supported APIs that this program uses,
including the number of different calls made to each API.
In most cases, you just need to arrange it so that your program
'BuildRequires' these RPMs and links to the libraries within them.

      #calls  RPM name
           8  mingw32-glib2
          11  mingw32-gtk-vnc
          70  mingw32-gtk2
           8  mingw32-libvirt
          10  mingw32-libxml2

24 unresolved symbols were found.  The full list of symbols
is listed as an appendix at the end of this report.  In this
section we try to identify known portability problems from
this list of symbols.

Program uses: __stack_chk_fail

The -fstack-protector option may not work with the Fedora MinGW
cross-compiler at this time.

Program uses: close

Program uses POSIX open/close/read/write/... APIs.  You should be
aware that Win32 provides functions with the same name which do not
have POSIX semantics.  Simple file operations will be fine, but you
will not be able to, for example, open /dev/* or other special files,
and select, locking and other POSIX features will not work the same
way.

To get more reliable semantics, we suggest you use a portability
library such as Gnulib, glib2, QtCore, etc.

If you are using read/write on sockets, then this won't work on
Windows.  You should use recv/send instead.

Program uses: dup

dup/dup2 may not work as expected in Win32.

To get more reliable semantics, we suggest you use a portability
library such as Gnulib, glib2, QtCore, etc.

Program uses: execvp

You cannot use fork to create new processes under Windows.  You have
to replace calls to fork/exec with CreateProcess or CreateThread.

If your program forks in order to run in parallel or to create
multiple identical workers, then you may have to restructure the
program.

If your program needs to share resources such as file descriptors
across the fork, then some limited options are available through
CreateProcess, but nothing like as rich as what is available in
Unix.

For server programs, we suggest using a portability library tuned
for the needs of servers, such as Apache Portable Runtime.

Program uses: fork

You cannot use fork to create new processes under Windows.  You have
to replace calls to fork/exec with CreateProcess or CreateThread.

If your program forks in order to run in parallel or to create
multiple identical workers, then you may have to restructure the
program.

If your program needs to share resources such as file descriptors
across the fork, then some limited options are available through
CreateProcess, but nothing like as rich as what is available in
Unix.

For server programs, we suggest using a portability library tuned
for the needs of servers, such as Apache Portable Runtime.

Program uses: getopt_long

GNU getopt_long is not available in Windows.

To get more reliable semantics, we suggest you use a portability
library such as Gnulib, glib2, QtCore, etc.

Program uses: socketpair

Program uses Berkeley sockets API.  Windows has a reasonable facsimile
called Winsock.  However it has some annoying API differences, in
particular: (1) You have to use WSAGetLastError instead of errno,
(2) error numbers have different names, (3) you cannot select on,
sockets, (4) a multitude of small API differences, (5) you have to
initialize Winsock before using it by calling WSAStartup.

To get more reliable semantics, we suggest you use a portability
library such as Gnulib, glib2, QtCore, etc.

If you are using read/write on sockets, then this won't work on
Windows.  You should use recv/send instead.

Program uses: usleep

usleep/nanosleep system calls do not exist on Windows.  You should
replace this with one of the Win32 equivalents such as Sleep.

To get more reliable semantics, we suggest you use a portability
library such as Gnulib, glib2, QtCore, etc.

Appendix - Full list of unresolved symbols

* = Symbol we were not able to give advice about.  If you know
more about this symbol, consider providing a patch for the
CrossReport program.

? = Win32 should supply this symbol, or it can be ignored because
it is a side-effect of the Unix toolchain.

	* __fprintf_chk
	? __libc_start_main
	* __snprintf_chk
	* __sprintf_chk
	  __stack_chk_fail
	* __strdup
	? _exit
	  close
	  dup
	  execvp
	  fork
	? fputc
	? free
	? fwrite
	* gdk_pixbuf_save
	  getopt_long
	* gtk_file_chooser_get_filename
	? malloc
	  socketpair
	? strcasecmp
	? strchr
	? strcmp
	? strtol
	  usleep
-------------- next part --------------
Cross-compilation report for: /usr/bin/inkscape

Report prepared on Wed Feb 11 11:15:16 2009.
Symbol database last updated on Wed Feb 11 10:23:49 2009 (0 days ago).

This table shows the supported APIs that this program uses,
including the number of different calls made to each API.
In most cases, you just need to arrange it so that your program
'BuildRequires' these RPMs and links to the libraries within them.

      #calls  RPM name
          74  mingw32-cairo
           1  mingw32-cairomm
           3  mingw32-fontconfig
           8  mingw32-freetype
          23  mingw32-gc
           6  mingw32-gettext
         260  mingw32-glib2
         153  mingw32-glibmm24
           1  mingw32-gmp
           2  mingw32-gnutls
         650  mingw32-gtk2
        1095  mingw32-gtkmm24
          26  mingw32-libpng
          30  mingw32-libsigc++20
          17  mingw32-libxml2
           3  mingw32-libxslt
          16  mingw32-openssl
          61  mingw32-pango
           8  mingw32-pangomm
           6  mingw32-popt
           5  mingw32-zlib

473 unresolved symbols were found.  The full list of symbols
is listed as an appendix at the end of this report.  In this
section we try to identify known portability problems from
this list of symbols.

Program uses: __stack_chk_fail

The -fstack-protector option may not work with the Fedora MinGW
cross-compiler at this time.

Program uses: close

Program uses POSIX open/close/read/write/... APIs.  You should be
aware that Win32 provides functions with the same name which do not
have POSIX semantics.  Simple file operations will be fine, but you
will not be able to, for example, open /dev/* or other special files,
and select, locking and other POSIX features will not work the same
way.

To get more reliable semantics, we suggest you use a portability
library such as Gnulib, glib2, QtCore, etc.

If you are using read/write on sockets, then this won't work on
Windows.  You should use recv/send instead.

Program uses: connect

Program uses Berkeley sockets API.  Windows has a reasonable facsimile
called Winsock.  However it has some annoying API differences, in
particular: (1) You have to use WSAGetLastError instead of errno,
(2) error numbers have different names, (3) you cannot select on,
sockets, (4) a multitude of small API differences, (5) you have to
initialize Winsock before using it by calling WSAStartup.

To get more reliable semantics, we suggest you use a portability
library such as Gnulib, glib2, QtCore, etc.

If you are using read/write on sockets, then this won't work on
Windows.  You should use recv/send instead.

Program uses: ioctl

Program uses fcntl or ioctl system calls.  Only a tiny fraction of
the functionality of these system calls is available in Windows,
often with differences in semantics.

To get more reliable semantics, we suggest you use a portability
library such as Gnulib, glib2, QtCore, etc.

Program uses: nanosleep

usleep/nanosleep system calls do not exist on Windows.  You should
replace this with one of the Win32 equivalents such as Sleep.

To get more reliable semantics, we suggest you use a portability
library such as Gnulib, glib2, QtCore, etc.

Program uses: open

Program uses POSIX open/close/read/write/... APIs.  You should be
aware that Win32 provides functions with the same name which do not
have POSIX semantics.  Simple file operations will be fine, but you
will not be able to, for example, open /dev/* or other special files,
and select, locking and other POSIX features will not work the same
way.

To get more reliable semantics, we suggest you use a portability
library such as Gnulib, glib2, QtCore, etc.

If you are using read/write on sockets, then this won't work on
Windows.  You should use recv/send instead.

Program uses: read

Program uses POSIX open/close/read/write/... APIs.  You should be
aware that Win32 provides functions with the same name which do not
have POSIX semantics.  Simple file operations will be fine, but you
will not be able to, for example, open /dev/* or other special files,
and select, locking and other POSIX features will not work the same
way.

To get more reliable semantics, we suggest you use a portability
library such as Gnulib, glib2, QtCore, etc.

If you are using read/write on sockets, then this won't work on
Windows.  You should use recv/send instead.

Program uses: socket

Program uses Berkeley sockets API.  Windows has a reasonable facsimile
called Winsock.  However it has some annoying API differences, in
particular: (1) You have to use WSAGetLastError instead of errno,
(2) error numbers have different names, (3) you cannot select on,
sockets, (4) a multitude of small API differences, (5) you have to
initialize Winsock before using it by calling WSAStartup.

To get more reliable semantics, we suggest you use a portability
library such as Gnulib, glib2, QtCore, etc.

If you are using read/write on sockets, then this won't work on
Windows.  You should use recv/send instead.

Appendix - Full list of unresolved symbols

* = Symbol we were not able to give advice about.  If you know
more about this symbol, consider providing a patch for the
CrossReport program.

? = Win32 should supply this symbol, or it can be ignored because
it is a side-effect of the Unix toolchain.

	* Array::get(int, Object*)
	* Dict::add(char*, Object*)
	* Dict::lookup(char*, Object*)
	* EmbedStream::EmbedStream(Stream*, Object*, int, unsigned int)
	* Function::parse(Object*)
	* GfxAxialShading::getColor(double, GfxColor*)
	* GfxColorSpace::parse(Object*)
	* GfxDeviceCMYKColorSpace::GfxDeviceCMYKColorSpace()
	* GfxDeviceGrayColorSpace::GfxDeviceGrayColorSpace()
	* GfxDeviceRGBColorSpace::GfxDeviceRGBColorSpace()
	* GfxFont::incRefCnt()
	* GfxFunctionShading::getColor(double, double, GfxColor*)
	* GfxGouraudTriangleShading::getTriangle(int, double*, double*, GfxColor*, double*, double*, GfxColor*, double*, double*, GfxColor*)
	* GfxImageColorMap::GfxImageColorMap(int, Object*, GfxColorSpace*)
	* GfxImageColorMap::getGrayLine(unsigned char*, unsigned char*, int)
	* GfxImageColorMap::getRGBLine(unsigned char*, unsigned int*, int)
	* GfxImageColorMap::~GfxImageColorMap()
	* GfxPath::GfxPath(int, double, double, GfxSubpath**, int, int)
	* GfxPath::close()
	* GfxPath::curveTo(double, double, double, double, double, double)
	* GfxPath::lineTo(double, double)
	* GfxPath::moveTo(double, double)
	* GfxPath::~GfxPath()
	* GfxRadialShading::getColor(double, GfxColor*)
	* GfxResources::GfxResources(XRef*, Dict*, GfxResources*)
	* GfxResources::lookupColorSpace(char*, Object*)
	* GfxResources::lookupFont(char*)
	* GfxResources::lookupGState(char*, Object*)
	* GfxResources::lookupPattern(char*)
	* GfxResources::lookupShading(char*)
	* GfxResources::lookupXObject(char*, Object*)
	* GfxResources::lookupXObjectNF(char*, Object*)
	* GfxResources::~GfxResources()
	* GfxState::GfxState(double, double, PDFRectangle*, int, int)
	* GfxState::clearPath()
	* GfxState::clip()
	* GfxState::clipToStrokePath()
	* GfxState::concatCTM(double, double, double, double, double, double)
	* GfxState::parseBlendMode(Object*, GfxBlendMode*)
	* GfxState::restore()
	* GfxState::save()
	* GfxState::setFillColorSpace(GfxColorSpace*)
	* GfxState::setFillPattern(GfxPattern*)
	* GfxState::setFont(GfxFont*, double)
	* GfxState::setLineDash(double*, int, double)
	* GfxState::setPath(GfxPath*)
	* GfxState::setStrokeColorSpace(GfxColorSpace*)
	* GfxState::setStrokePattern(GfxPattern*)
	* GfxState::setTransfer(Function**)
	* GfxState::shift(double, double)
	* GfxState::textShift(double, double)
	* GfxState::~GfxState()
	* Glib::spawn_async_with_pipes(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Glib::ArrayHandle<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, Glib::Container_Helpers::TypeTraits<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, Glib::SpawnFlags, sigc::slot<void, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil> const&, int*, int*, int*, int*)
	* Glib::spawn_close_pid(int)
	* Glib::ustring::append(char const*, unsigned long)
	* Glib::ustring::append(unsigned long, char)
	* Glib::ustring::at(unsigned long) const
	* Glib::ustring::erase(unsigned long, unsigned long)
	* Glib::ustring::find(Glib::ustring const&, unsigned long) const
	* Glib::ustring::find(char const*, unsigned long) const
	* Glib::ustring::find(char, unsigned long) const
	* Glib::ustring::insert(unsigned long, Glib::ustring const&)
	* Glib::ustring::insert(unsigned long, char const*)
	* Glib::ustring::operator[](unsigned long) const
	* Glib::ustring::rfind(char, unsigned long) const
	* Glib::ustring::ustring(Glib::ustring const&, unsigned long, unsigned long)
	* Glib::ustring::ustring(char const*, unsigned long)
	* GlobalParams::GlobalParams()
	* GlobalParams::getUnicodeMap(GooString*)
	* GooString::GooString(char const*)
	* GooString::~GooString()
	* Gtk::Box_Helpers::BoxList::operator[](unsigned long) const
	* Gtk::HandleBox::on_child_attached(Gtk::Widget*)
	* Gtk::Menu_Helpers::MenuList::operator[](unsigned long) const
	* ImageStream::ImageStream(Stream*, int, int, int)
	* ImageStream::getLine()
	* ImageStream::reset()
	* ImageStream::~ImageStream()
	* Lexer::Lexer(XRef*, Object*)
	* Object::fetch(XRef*, Object*)
	* Object::free()
	* Object::getTypeName()
	* Object::initDict(XRef*)
	* Object::print(_IO_FILE*)
	* PDFDoc::PDFDoc(GooString*, GooString*, GooString*, void*)
	* PDFDoc::~PDFDoc()
	* Page::loadThumb(unsigned char**, int*, int*, int*)
	* Parser::Parser(XRef*, Lexer*, int)
	* Parser::getObj(Object*, unsigned char*, CryptAlgorithm, int, int, int)
	* Parser::~Parser()
	* PyCFunction_NewEx
	* PyCObject_AsVoidPtr
	* PyCObject_FromVoidPtr
	* PyDict_New
	* PyErr_Fetch
	* PyErr_NewException
	* PyErr_Occurred
	* PyErr_SetObject
	* PyErr_SetString
	* PyImport_AddModule
	* PyList_Append
	* PyList_New
	* PyList_SetItem
	* PyMapping_Check
	* PyMapping_HasKey
	* PyMapping_SetItemString
	* PyMapping_Size
	* PyModule_GetDict
	* PyObject_GetItem
	* PyObject_SetItem
	* PyObject_Str
	* PyRun_StringFlags
	* PySequence_Check
	* PySequence_GetItem
	* PySequence_SetItem
	* PySequence_Size
	* PyString_AsString
	* PyString_FromString
	* PyString_FromStringAndSize
	* PyString_Size
	* PyTuple_New
	* PyTuple_SetItem
	* PyType_IsSubtype
	* Py_Finalize
	* Py_InitModule4_64
	* Py_Initialize
	* Stream::addFilters(Object*)
	* UnicodeMap::incRefCnt()
	* UnicodeMap::mapUnicode(unsigned int, char*, int)
	* XFree
	* XGetWindowAttributes
	* XGetWindowProperty
	* XInternAtom
	* XListProperties
	* _IO_getc
	* _IO_putc
	* _Unwind_Resume
	* __assert_fail
	* __cxa_allocate_exception
	* __cxa_atexit
	* __cxa_bad_cast
	* __cxa_bad_typeid
	* __cxa_begin_catch
	* __cxa_call_unexpected
	* __cxa_end_catch
	* __cxa_free_exception
	* __cxa_get_exception_ptr
	* __cxa_guard_abort
	* __cxa_guard_acquire
	* __cxa_guard_release
	* __cxa_pure_virtual
	* __cxa_rethrow
	* __cxa_throw
	* __divdc3
	* __dynamic_cast
	* __errno_location
	* __fprintf_chk
	* __fxstat
	* __gxx_personality_v0
	* __isinf
	* __isnan
	? __libc_start_main
	* __memcpy_chk
	* __muldc3
	* __powidf2
	* __printf_chk
	* __snprintf_chk
	* __sprintf_chk
	  __stack_chk_fail
	* __strncpy_chk
	* __vfprintf_chk
	* __vsnprintf_chk
	* __xstat
	* _cmsChannelsOf
	* _setjmp
	* abort
	* acos
	* asin
	* atan
	* atan2
	* cabs
	* cairo_ft_font_face_create_for_pattern
	* calloc
	* ceil
	* ceilf
	* clock
	* clog
	  close
	* cmsCloseProfile
	* cmsCreateProofingTransform
	* cmsCreateTransform
	* cmsCreate_sRGBProfile
	* cmsDeleteTransform
	* cmsDoTransform
	* cmsErrorAction
	* cmsGetColorSpace
	* cmsGetDeviceClass
	* cmsOpenProfileFromFile
	* cmsOpenProfileFromMem
	* cmsSetAlarmCodes
	* cmsSetErrorHandler
	* cmsTakeProductDesc
	  connect
	* copyString
	* cos
	* ctime
	* error(int, char*, ...)
	* exit
	* exp
	* fclose
	* feof
	* ferror
	* fflush
	* fgetc
	* fgets
	* fileno
	* floor
	* floorf
	* fmod
	* fopen
	? fputc
	* fputs
	* fread
	? free
	* fseek
	? fwrite
	* g_dir_open
	* g_dir_read_name
	* g_file_test
	* g_filename_from_uri
	* g_filename_from_utf8
	* g_filename_to_uri
	* g_filename_to_utf8
	* g_get_current_dir
	* g_get_home_dir
	* g_getenv
	* gdk_pixbuf_new_from_file
	* gdk_pixbuf_save
	* gdk_x11_display_get_xdisplay
	* gdk_x11_drawable_get_xid
	* gdk_x11_get_xatom_name
	* gdk_x11_lookup_xdisplay
	* gdk_x11_screen_get_xscreen
	* getcwd
	* getenv
	* gethostbyname
	* gfree
	* gmallocn
	* gmtime
	* gnome_vfs_close
	* gnome_vfs_create
	* gnome_vfs_init
	* gnome_vfs_initialized
	* gnome_vfs_open
	* gnome_vfs_read
	* gnome_vfs_result_to_string
	* gnome_vfs_uri_extract_short_name
	* gnome_vfs_uri_extract_short_path_name
	* gnome_vfs_uri_is_local
	* gnome_vfs_uri_new
	* gnome_vfs_write
	* gtk_file_chooser_get_filename
	* gtk_file_chooser_set_filename
	* gtk_window_set_default_icon_from_file
	* gtkspell_new_attach
	* hypot
	  ioctl
	* isalnum
	* isprint
	* isspace
	* ldexp
	* localtime
	* log
	* log10
	* mallinfo
	? malloc
	* memchr
	* memcpy
	* memmove
	* memset
	* mkdir
	* modf
	  nanosleep
	  open
	* operator new(unsigned long)
	* operator new(unsigned long, std::nothrow_t const&)
	* operator new[](unsigned long)
	* pclose
	* popen
	* poptHelpOptions
	* pthread_create
	* pthread_self
	* putchar
	* puts
	* qsort
	* rand
	  read
	* realloc
	* recv
	* remove
	* rename
	* rint
	* round
	* send
	* setlocale
	* signal
	* sin
	* sincos
	  socket
	* sqrt
	* sqrtf
	* sscanf
	* std::_List_node_base::hook(std::_List_node_base*)
	* std::_List_node_base::swap(std::_List_node_base&, std::_List_node_base&)
	* std::_List_node_base::transfer(std::_List_node_base*, std::_List_node_base*)
	* std::_List_node_base::unhook()
	* std::_Rb_tree_decrement(std::_Rb_tree_node_base const*)
	* std::_Rb_tree_decrement(std::_Rb_tree_node_base*)
	* std::_Rb_tree_increment(std::_Rb_tree_node_base const*)
	* std::_Rb_tree_increment(std::_Rb_tree_node_base*)
	* std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)
	* std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)
	* std::__basic_file<char>::is_open() const
	* std::__basic_file<char>::~__basic_file()
	* std::__throw_bad_alloc()
	* std::__throw_bad_cast()
	* std::__throw_length_error(char const*)
	* std::__throw_logic_error(char const*)
	* std::__throw_out_of_range(char const*)
	* std::bad_alloc::~bad_alloc()
	* std::basic_filebuf<char, std::char_traits<char> >::basic_filebuf()
	* std::basic_filebuf<char, std::char_traits<char> >::close()
	* std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode)
	* std::basic_filebuf<char, std::char_traits<char> >::~basic_filebuf()
	* std::basic_ifstream<char, std::char_traits<char> >::~basic_ifstream()
	* std::basic_ios<char, std::char_traits<char> >::clear(std::_Ios_Iostate)
	* std::basic_ios<char, std::char_traits<char> >::imbue(std::locale const&)
	* std::basic_ios<char, std::char_traits<char> >::init(std::basic_streambuf<char, std::char_traits<char> >*)
	* std::basic_ios<char, std::char_traits<char> >::setstate(std::_Ios_Iostate)
	* std::basic_ios<char, std::char_traits<char> >::widen(char) const
	* std::basic_ios<char, std::char_traits<char> >::~basic_ios()
	* std::basic_ios<wchar_t, std::char_traits<wchar_t> >::imbue(std::locale const&)
	* std::basic_ios<wchar_t, std::char_traits<wchar_t> >::init(std::basic_streambuf<wchar_t, std::char_traits<wchar_t> >*)
	* std::basic_ios<wchar_t, std::char_traits<wchar_t> >::~basic_ios()
	* std::basic_iostream<char, std::char_traits<char> >::~basic_iostream()
	* std::basic_istream<char, std::char_traits<char> >& std::basic_istream<char, std::char_traits<char> >::_M_extract<double>(double&)
	* std::basic_istream<char, std::char_traits<char> >::get()
	* std::basic_istream<char, std::char_traits<char> >::read(char*, long)
	* std::basic_istream<char, std::char_traits<char> >::seekg(long, std::_Ios_Seekdir)
	* std::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_istringstream()
	* std::basic_ofstream<char, std::char_traits<char> >::~basic_ofstream()
	* std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
	* std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::_M_insert<double>(double)
	* std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::_M_insert<long>(long)
	* std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::_M_insert<unsigned long>(unsigned long)
	* std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
	* std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
	* std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
	* std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char)
	* std::basic_ostream<char, std::char_traits<char> >::flush()
	* std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
	* std::basic_ostream<char, std::char_traits<char> >::put(char)
	* std::basic_ostream<char, std::char_traits<char> >::write(char const*, long)
	* std::basic_ostream<char, std::char_traits<char> >::~basic_ostream()
	* std::basic_ostream<char, std::char_traits<char> >::~basic_ostream()
	* std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& std::basic_ostream<wchar_t, std::char_traits<wchar_t> >::_M_insert<unsigned long>(unsigned long)
	* std::basic_ostream<wchar_t, std::char_traits<wchar_t> >::operator<<(int)
	* std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::basic_ostringstream(std::_Ios_Openmode)
	* std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::str() const
	* std::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_ostringstream()
	* std::basic_ostringstream<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::~basic_ostringstream()
	* std::basic_streambuf<char, std::char_traits<char> >::imbue(std::locale const&)
	* std::basic_streambuf<char, std::char_traits<char> >::setbuf(char*, long)
	* std::basic_streambuf<char, std::char_traits<char> >::showmanyc()
	* std::basic_streambuf<char, std::char_traits<char> >::sputc(char)
	* std::basic_streambuf<char, std::char_traits<char> >::sync()
	* std::basic_streambuf<char, std::char_traits<char> >::uflow()
	* std::basic_streambuf<char, std::char_traits<char> >::xsgetn(char*, long)
	* std::basic_streambuf<char, std::char_traits<char> >::xsputn(char const*, long)
	* std::basic_streambuf<char, std::char_traits<char> >::~basic_streambuf()
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_leak_hard()
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_mutate(unsigned long, unsigned long, unsigned long)
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_M_destroy(std::allocator<char> const&)
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&)
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::append(char const*)
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::append(char const*, unsigned long)
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::append(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::append(unsigned long, char)
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::assign(char const*)
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::assign(char const*, unsigned long)
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::assign(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, unsigned long, std::allocator<char> const&)
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long, unsigned long)
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::begin()
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::clear()
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::compare(char const*) const
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::compare(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::end()
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::find(char const*, unsigned long) const
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::find(char const*, unsigned long, unsigned long) const
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::find(char, unsigned long) const
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::find_last_not_of(char, unsigned long) const
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::push_back(char)
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::replace(unsigned long, unsigned long, char const*, unsigned long)
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::reserve(unsigned long)
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::resize(unsigned long, char)
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::rfind(char, unsigned long) const
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::substr(unsigned long, unsigned long) const
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
	* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
	* std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_Rep::_M_destroy(std::allocator<wchar_t> const&)
	* std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_Rep::_S_create(unsigned long, unsigned long, std::allocator<wchar_t> const&)
	* std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::assign(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&)
	* std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::assign(wchar_t const*, unsigned long)
	* std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::~basic_string()
	* std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::_M_sync(char*, unsigned long, unsigned long)
	* std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str() const
	* std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
	* std::basic_stringbuf<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::_M_sync(wchar_t*, unsigned long, unsigned long)
	* std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::~basic_stringstream()
	* std::ctype<char> const& std::use_facet<std::ctype<char> >(std::locale const&)
	* std::domain_error::domain_error(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
	* std::exception::what() const
	* std::exception::~exception()
	* std::exception::~exception()
	* std::ios_base::Init::Init()
	* std::ios_base::Init::~Init()
	* std::ios_base::ios_base()
	* std::ios_base::~ios_base()
	* std::locale::classic()
	* std::locale::locale()
	* std::locale::locale(char const*)
	* std::locale::locale(std::locale const&)
	* std::locale::operator=(std::locale const&)
	* std::locale::~locale()
	* std::logic_error::what() const
	* std::logic_error::~logic_error()
	* std::runtime_error::runtime_error(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
	* std::runtime_error::what() const
	* std::runtime_error::~runtime_error()
	* std::runtime_error::~runtime_error()
	* std::terminate()
	? strcasecmp
	? strchr
	? strcmp
	* strcpy
	* strcspn
	* strdup
	* strerror
	* strftime
	* strlen
	* strncmp
	* strncpy
	* strpbrk
	* strrchr
	* strspn
	* strstr
	* strtod
	? strtol
	* strtoll
	* strtoul
	* system
	* tan
	* time
	* tmpfile
	* tolower
	* trunc
	* unlink
	* virtual thunk to std::basic_ostream<char, std::char_traits<char> >::~basic_ostream()
	* virtual thunk to std::basic_ostream<char, std::char_traits<char> >::~basic_ostream()
	* wmemcpy


More information about the mingw mailing list