diff --git a/install-wrappers.sh b/install-wrappers.sh index 50e1d4e..bfa0909 100755 --- a/install-wrappers.sh +++ b/install-wrappers.sh @@ -69,6 +69,7 @@ if [ -n "$HOST" ]; then done fi $CC wrappers/clang-target-wrapper.c -o "$PREFIX/bin/clang-target-wrapper$EXEEXT" -O2 -Wl,-s $WRAPPER_FLAGS +$CC wrappers/dlltool-wrapper.c -o "$PREFIX/bin/dlltool-wrapper$EXEEXT" -O2 -Wl,-s $WRAPPER_FLAGS $CC wrappers/windres-wrapper.c -o "$PREFIX/bin/windres-wrapper$EXEEXT" -O2 -Wl,-s $WRAPPER_FLAGS $CC wrappers/llvm-wrapper.c -o "$PREFIX/bin/llvm-wrapper$EXEEXT" -O2 -Wl,-s $WRAPPER_FLAGS if [ -n "$EXEEXT" ]; then @@ -100,7 +101,8 @@ for arch in $ARCHS; do else ln -sf windres-wrapper$EXEEXT $arch-w64-$target_os-windres$EXEEXT fi - for exec in ld objdump dlltool; do + ln -sf dlltool-wrapper$EXEEXT $arch-w64-$target_os-dlltool$EXEEXT + for exec in ld objdump; do ln -sf $exec-wrapper.sh $arch-w64-$target_os-$exec done done @@ -117,10 +119,10 @@ if [ -n "$EXEEXT" ]; then # we are installing wrappers for. case $ARCHS in *$HOST_ARCH*) - for exec in clang clang++ gcc g++ cc c99 c11 c++ addr2line ar ranlib nm objcopy strings strip windres; do + for exec in clang clang++ gcc g++ cc c99 c11 c++ addr2line ar dlltool ranlib nm objcopy strings strip windres; do ln -sf $HOST-$exec$EXEEXT $exec$EXEEXT done - for exec in ld objdump dlltool; do + for exec in ld objdump; do ln -sf $HOST-$exec $exec done ;; diff --git a/wrappers/dlltool-wrapper.c b/wrappers/dlltool-wrapper.c new file mode 100644 index 0000000..8c770a6 --- /dev/null +++ b/wrappers/dlltool-wrapper.c @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2018 Martin Storsjo + * + * This file is part of llvm-mingw. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "native-wrapper.h" + +#ifndef DEFAULT_TARGET +#define DEFAULT_TARGET "x86_64-w64-mingw32" +#endif + +int _tmain(int argc, TCHAR* argv[]) { + const TCHAR *dir; + const TCHAR *target; + split_argv(argv[0], &dir, NULL, &target, NULL); + if (!target) + target = _T(DEFAULT_TARGET); + TCHAR *arch = _tcsdup(target); + TCHAR *dash = _tcschr(arch, '-'); + if (dash) + *dash = '\0'; + + int max_arg = argc + 2; + const TCHAR **exec_argv = malloc((max_arg + 1) * sizeof(*exec_argv)); + int arg = 0; + exec_argv[arg++] = concat(dir, _T("llvm-dlltool")); + + if (!_tcscmp(arch, _T("i686"))) { + exec_argv[arg++] = _T("-m"); + exec_argv[arg++] = _T("i386"); + } else if (!_tcscmp(arch, _T("x86_64"))) { + exec_argv[arg++] = _T("-m"); + exec_argv[arg++] = _T("i386:x86-64"); + } else if (!_tcscmp(arch, _T("armv7"))) { + exec_argv[arg++] = _T("-m"); + exec_argv[arg++] = _T("arm"); + } else if (!_tcscmp(arch, _T("aarch64"))) { + exec_argv[arg++] = _T("-m"); + exec_argv[arg++] = _T("arm64"); + } else { + _ftprintf(stderr, _T("Arch "TS" unsupported\n"), arch); + return 1; + } + + for (int i = 1; i < argc; i++) + exec_argv[arg++] = argv[i]; + + exec_argv[arg] = NULL; + if (arg > max_arg) { + fprintf(stderr, "Too many options added\n"); + abort(); + } + + return run_final(exec_argv[0], exec_argv); +} diff --git a/wrappers/dlltool-wrapper.sh b/wrappers/dlltool-wrapper.sh deleted file mode 100755 index 7940c61..0000000 --- a/wrappers/dlltool-wrapper.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2018 Martin Storsjo -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -DIR="$(cd "$(dirname "$0")" && pwd)" -export PATH="$DIR":"$PATH" - -BASENAME="$(basename "$0")" -TARGET="${BASENAME%-*}" -DEFAULT_TARGET=x86_64-w64-mingw32 -if [ "$TARGET" = "$BASENAME" ]; then - TARGET=$DEFAULT_TARGET -fi -ARCH="${TARGET%%-*}" -case $ARCH in -i686) M=i386 ;; -x86_64) M=i386:x86-64 ;; -armv7) M=arm ;; -aarch64) M=arm64 ;; -esac -llvm-dlltool -m $M "$@"