Skip to content

Latest commit

 

History

History
126 lines (103 loc) · 4.59 KB

README.cross-building.md

File metadata and controls

126 lines (103 loc) · 4.59 KB

Cross-building go-yara

go-yara can be cross-built for a different CPU architecture/operating system platform, provided a C cross-compiler for the target platform is available to be used by the cgo tool.

After the yara library has been built using the proper C cross-compiler through the usual configure / make / make install steps, go-yara can be built and installed. The following environment variables need to be set when running go build or go install:

  • GOOS, GOARCH indicate the cross compilation target.
  • CGO_ENABLED has to be set to 1 beacuse it defaults to 0 when cross-compiling.
  • CC may have to be set to point to the C cross compiler. (It defaults to the system C compiler, usually gcc).
  • PKG_CONFIG_PATH may have to be set to point to the pkg-config directory where the yara.pc file has been installed. (Alternatively, the yara_no_pkg_config build tag can be used together with CGO_CFLAGS and CGO_LDFLAGS environment variables.)

For the examples below, YARA is built out-of-tree, i.e. the build artifacts are placed into a separate directory referred to by the YARA_BUILD_* shell variables. YARA_SRC refers to the YARA source directory. The PREFIX_* shell variables refer to target directory for the make install step.

Since the MinGW environments provided by MSYS2 are technically cross-building environments, similar steps have to be taken, see below.

Example: Building an entirely static Linux binary (musl-libc)

Because binaries that are linked statically with GNU libc are not entirely portable musl libc can be used instead. (Sadly, it does not seem to be possible to cross-build for different architctures using the standard musl-gcc.specs file.)

On a Debian-based system, install musl-tools.

Build libyara and _examples/simple-yara:

( cd ${YARA_BUILD_LINUX_MUSL} && \
  ${YARA_SRC}/configure CC=musl-gcc --prefix=${PREFIX_LINUX_MUSL})
make -C ${YARA_BUILD_LINUX_MUSL} install

GOOS=linux GOARCH=amd64 CGO_ENABLED=1 \
  CC=musl-gcc \
  PKG_CONFIG_PATH=${PREFIX_LINUX_MUSL}/lib/pkgconfig \
      go build -ldflags '-extldflags "-static"' -tags yara_static -o simple-yara-musl ./_examples/simple-yara

Example: Cross-building for Windows

On a Debian-based system, install the MinGW C compiler gcc-mingw-w64-i686, gcc-mingw-w64-x86-64 for Win32, Win64, respectively.

Build libyara and _examples/simple-yara for Win32:

( cd ${YARA_BUILD_WIN32} && \
  ${YARA_SRC}/configure --host=i686-w64-mingw32 --prefix=${PREFIX_WIN32} )
make -C ${YARA_BUILD_WIN32} install

GOOS=windows GOARCH=386 CGO_ENABLED=1 \
  CC=i686-w64-mingw32-gcc \
  PKG_CONFIG_PATH=${PREFIX_WIN32}/lib/pkgconfig \
      go build -ldflags '-extldflags "-static"' -tags yara_static -o simple-yara-w32.exe ./_examples/simple-yara

Build libyara and _examples/simple-yara for Win64:

( cd ${YARA_BUILD_WIN64} && \
  ${YARA_SRC}/configure --host=x86_64-w64-mingw32 --prefix=${PREFIX_WIN64} )
make -C ${YARA_BUILD_WIN64} install

GOOS=windows GOARCH=amd64 CGO_ENABLED=1 \
  CC=x86_64-w64-mingw32-gcc \
  PKG_CONFIG_PATH=${PREFIX_WIN64}/lib/pkgconfig \
      go build -ldflags '-extldflags "-static"' -tags yara_static -o simple-yara-w64.exe ./_examples/simple-yara

Example: Building on Windows, using MSYS2

This example assumes that MSYS2 has been installed to C:\msys64. The following packages have to be installed:

  • autoconf
  • automake
  • libtool
  • mingw-w64-{x86_64,i686}-gcc
  • mingw-w64-{x86_64,i686}-make
  • mingw-w64-{x86_64,i686}-pkgconf

While MSYS2 contains usable Go compilers, the official distribution is used here.

Build libyara and _examples/simple-yara for Win32:

  • At the MinGW 32 prompt:
    cd ${YARA_BUILD_WIN32} && ${YARA_SRC}/configure
    make -C ${YARA_BUILD_WIN32} install
    
  • At the CMD or Powershell prompt:
    set PATH=%PATH%;C:\msys64\mingw32\bin
    set CGO_ENABLED=1
    set GOARCH=386
    go build -ldflags "-extldflags=-static" -tags yara_static -o simple-yara-w32.exe .\_examples\simple-yara
    

Build libyara and _examples/simple-yara for Win64:

  • At the MinGW 64 prompt:
    cd ${YARA_BUILD_WIN64} && ${YARA_SRC}/configure
    make -C ${YARA_BUILD_WIN64} install
    
  • At the CMD or Powershell prompt:
    set PATH=%PATH%;C:\msys64\mingw64\bin
    set CGO_ENABLED=1
    set GOARCH=amd64
    go build -ldflags "-extldflags=-static" -tags yara_static -o simple-yara-w64.exe .\_examples\simple-yara