summaryrefslogtreecommitdiff
path: root/README.win32
diff options
context:
space:
mode:
Diffstat (limited to 'README.win32')
-rw-r--r--README.win32247
1 files changed, 238 insertions, 9 deletions
diff --git a/README.win32 b/README.win32
index 52be775..020c38f 100644
--- a/README.win32
+++ b/README.win32
@@ -1,17 +1,246 @@
-Run msvcbuild.bat to build for Win32 with MSVC.
+Information, Recommendations and Build Instructions for Windows
+**************************************************************************
-The batch file depends on the MSVC build environment being set (PATH, etc.),
-this can be done with Visual Studio's vsvars32.bat, or by starting a Visual
-Studio shell.
+_____________________________ IMPORTANT _____________________________
+The execution of the currently shipped msvcbuild.bat batch script will
+causes ANY subsequent none-MSVC build to fail. It has been wrongly set
+up to copy several MSVC-specific header files from <libnet-root>/win32/
+to <libnet-root>/include/ and <libnet-root>/include/libnet/ during the
+build process. This is a high priority issue and will be taken care of
+ASAP. If you ever have to make use of this file, consider compiling all
+other builds from a separate tarball.
+_____________________________________________________________________
+
+This file list additional steps and suggestions for Windows users.
+Please see INSTALL for a more general overview and doc/PORTED for
+other platforms.
+
+Unless you know what you are doing, you should follow the recommendations
+below. Notice that there are plenty of other (sometimes better) ways
+to build libnet, but these steps and suggestions are known to work.
+If the build breaks, please re-read this guide carefully.
+
+Contents
+========
+
+1. Introduction
+ 1.1 Microsoft Visual C++ and GCC/MinGW
+ 1.2 WinPcap/Npcap
+ 1.3 Supported Operating Systems
+
+2. MinGW Compiler
+ 2.1 Native
+ 2.2 Cross-Compiling
+
+3. Microsoft Visual C++
+
+
+
+1. Introduction
+===============
+
+
+1.1 Microsoft Visual C++ and GCC/MinGW
+--------------------------------------------------------------
+
+The Microsoft Visual C++ compiler (aka MSVC) and the GCC Windows port
+(aka MinGW) are unfortunately not fully compatible. Although MSVC is a
+great compiler, libnet has been developed with the GNU toolchain in mind.
+So building libnet with the Visual C++ Build Tools will always have its
+flaws, even while it might work in some points.
+
+Most of libnet’s development is therefore done with GCC and its MinGW
+Windows port.
+In other words, if this this all new to you, I recommended you to use
+MinGW for building libnet on Windows.
+
+
+On the other hand, the two can work well together:
+
+If you for instance build libnet with MinGW, and you want to use it
+with MSVC too (or vice versa), you can use the DLL and the supplied
+"libnet*.def" file located in <libnet-root>/win32/ (this file is always
+rebuild at the end of every successful build on windows) to create an
+MSVC compatible import library that you can use to link your projects
+with without the need of rebuilding libnet again.
+
+To produce a MinGW compatible import library from any libnet DLL:
+
+$ dlltool -D path/to/libnet*.dll -d path/to/libnet*.def -l libnet.dll.a
+
+To produce a MSVC compatible import library from any libnet DLL:
+
+$ lib /machine:X64 /def:example.def (for x64)
+or
+$ lib /machine:X86 /def:example.def (for x86)
+
+Note 1: If you have removed any or all symbol information from the DLL
+(aka "stripped" it), during build, by for example running configure
+with "--enable-fast", then this obviously won't work.
+
+
+1.2 WinPcap/Npcap
+-----------------
+
+Currently, the supported method of sending packets under Windows is with
+WinPcap (http://www.winpcap.org). However, libnet's support for
+Npcap (http://www.npcap.org), an update of WinPcap sponsored by the
+Nmap Project, is being seriously considered.
+Windows users should know that with the switch to Npcap, WinPcap compatibility
+is expected to be deprecated.
+
+Please be sure to install the WinPcap/Npcap driver/DLL and make sure
+that the content of the Wpdpack's/Npcap SDK's Include and Lib directories
+are somewhat reachable by your compiler.
+
+Note 2: Remember that you cannot use MSVC-generated .lib files to create
+shared libraries with MinGW, you have to use the lib*.a files.
+WinPcap development came to a standstill before the Developer's Pack ever
+provided x64 compatible lib*.a files for use with MinGW/Cygwin. And since
+libnet depends on WinPcap, you would have to compile 64-bit lib*.a libraries
+yourself if you want to be able to produce 64-bit compatible libnet builds
+with MinGW/Cygwin.
+
+Luckily for you, this has been taken care of by me. 64-bit compatible
+WinPcap libraries as well as DIY instructions can be found in
+<libnet-root>/win32/wpdpack/.
+
+1.3 Supported Operating Systems
+-------------------------------
+
+At the latest with the switch to Npcap, libnet support for Windows XP,
+Windows Server 2003 and earlier will be dropped.
+I can think of too many better things to do than to continuously deal with
+error handling and backwards compatibility (msvcrt vs crtdll) for EOL systems.
+
+Remnants in the source suggests that building libnet with Cygwin must have
+been possible at some point. This may or may not be the case these days.
+If it still works, let me know. If you get it to work (again), let me know.
+And if you need to get it to work, let me know.
+
+
+2. MinGW Compiler
+=================
+
+Both native and cross compilation are possible, and there are quite a
+few possibilities and options to choose from. If you just want to get
+over with it, follow these steps:
+
+Known traps are:
+- Setting the wrong (or no) prefix. (important when running 'make install')
+- Using incompatible WinPcap libraries for x64 (see Note 2)
+- Not having said WinPcap libraries and header files in your compiler's path
+
+Note 3: If you're building with MinGW, and want to install libnet to your
+compiler's lib and include directories, you almost always want to set your
+prefix manually. If you don't know what that means, run "gcc -v", look for
+"--prefix=/some/path" and use that.
+
+Note 4: If you're using a multilib MinGW-w64 GCC compiler, make sure to add
+the -m32 or -m64 CFLAGS to instruct the compiler to build for your desired
+architecture.
+
+
+2.1 Native
+----------
+
+The recommended MinGW distribution for building libnet is Msys2.
+First, follow the installation instructions for Msys2 available at
+msys2.github.io. Then, depending on your desired target architecture,
+open a mingw32 or mingw64 shell, navigate to the source directory,
+and execute the following commands:
+
+1. If you want to produce 32 bit binaries:
+
+$ CFLAGS="-O2 -Wall -I$(pwd)/win32/wpdpack/Include" LDFLAGS="-L$(pwd)/win32/wpdpack/Lib/" ./configure --prefix=/mingw64
+
+If you want to produce 64 bit binaries:
+
+$ CFLAGS="-O2 -Wall -I$(pwd)/win32/wpdpack/Include" LDFLAGS="-L$(pwd)/win32/wpdpack/Lib/x64" ./configure --prefix=/mingw64
+
+2. $ make
+
+3. $ make install (optional)
+
+
+2.2 Cross-Compiling
+-------------------
+
+Note 5: During sample building, you may see a warning similar this:
+
+ Could not determine the host path corresponding to
+ `... a path ...'
+ Continuing, but uninstalled executables may not work.
+
+This, among other things, means that the samples will depend on
+a shared version of libgcc (aka libgcc_s_sjlj-1.dll). If no shared
+version of libgcc was built when the compiler was configured, you
+most likely won't be able to execute them.
+In that case, your best bet is to link with the static version
+of libgcc by disabling shared libraries altogether
+(./configure --disable-shared).
+
+
+In general, you should know what you're doing and what your host, target
+and compiler are all about beforehand.
+These steps have been successfully tested on Ubuntu and the default
+mingw32-w32 toolchain (GCC 4.8).
+The recommended steps to build libnet therefore are:
+
+1. If you're targeting x86:
+$ CFLAGS="-O2 -Wall -I$(pwd)/win32/wpdpack/Include" LDFLAGS="-L$(pwd)/win32/wpdpack/Lib" ./configure --host=i686-w64-mingw32 --prefix=/usr/i686-w64-mingw32
+
+If you're targeting x64:
+$ CFLAGS="-O2 -Wall -I$(pwd)/win32/wpdpack/Include" LDFLAGS="-L$(pwd)/win32/wpdpack/Lib/x64" ./configure --host=x86_64-w64-mingw32 --prefix=/usr/x86_64-w64-mingw32
+
+2. make
+
+3. (optionally) sudo make install
+
+Notice that the --host option is usually all you need for cross-compiling.
+
+Note 6: Although the steps should be very similar, if you're using any
+other distribution of MinGW (cross or native), you're pretty much on your own.
+You can send suggestions and complains to https://github.com/sgeto/libnet/issues
+
+
+3. Microsoft Visual C++
+=======================
+Known traps are:
+- Not using the correct (x86 or x64) version of the Visual Studio command prompt
+- Using incompatible WinPcap libraries for x64 (see Note 2)
+- Not having said WinPcap libraries and header files in your compiler's path
+
+Until the issue described at the top of this document is completely
+resolved, MSVC support should be considered a work in progress and unsafe.
+And that’s why I won't even go into it, and instead leave you with these
+old but still perfectly fine instructions:
+
+
+
+Run msvcbuild.bat to build for Win32 with MSVC
+----------------------------------------------
+
+The batch file takes arguments and sets the appropriate path and environment
+variables for the desired built by running either vsvars32.bat (for x86),
+vcvars64.bat (for x64) or vcvarsall.bat (for Cross development).
+Type "msvcbuild.bat help" for a description of all available options.
+If no argument is specified, x86 is assumed.
The batch file copies pre-prepared headers out of win32/, avoiding the
-requirement for a gnu (cygwin or mingw) build environment.
+requirement for a gnu (Cygwin or MinGW) build environment.
-The batch file hard-codes the location of the WinPcap developer's tools,
-you may have to modify it for your environment, or install the developer's
+The batch file hard-codes the location of the WinPcap developer's tools.
+You may have to modify it for your environment, or install the developer's
pack in the expected location.
-For Visual Studio 2010, the shell can be found at:
+Although not required, it is advisable to execute the batch file from a
+VS2015 Developer Command Prompt.
+
+For Visual Studio 2015, the shell can be found at:
- Program Files >> Microsoft Visual Studio 2010 >> Visual Studio Tools >> Visual Studio Command Prompt
+ Program Files (x86) >> Microsoft Visual Studio 14.0 >> Common7 >> Tools >> VsDevCmd.bat
+After building, libnet libraries and .obj files are found in newly created
+"<libnet-root>\libnet\src\[Win32|Win64]\" "<libnet-root>\libnet\lib\[x86|x64]\"
+respectively.