mirror of
https://github.com/Relintai/osxcross.git
synced 2025-02-03 22:45:56 +01:00
an attempt to fix the otool disassembler
This commit is contained in:
parent
133a61d75a
commit
69d275877b
@ -45,7 +45,7 @@ But be careful, that repository is known to cause [troubles](https://github.com/
|
|||||||
Then run `./build.sh` to build the cross toolchain.
|
Then run `./build.sh` to build the cross toolchain.
|
||||||
(It will search 'tarballs' for your SDK and then build in its own directory.)
|
(It will search 'tarballs' for your SDK and then build in its own directory.)
|
||||||
|
|
||||||
**Do not forget** to add the `<path>/target/bin` to your PATH variable.
|
**Do not forget** to add `<path>/target/bin` to your PATH variable.
|
||||||
|
|
||||||
That's it. See usage examples below.
|
That's it. See usage examples below.
|
||||||
|
|
||||||
|
4
build.sh
4
build.sh
@ -182,6 +182,10 @@ patch -p1 < $PATCH_DIR/cctools-ld64-strnlen.patch
|
|||||||
patch -p0 < $PATCH_DIR/cctools-ld64-llvm-3.7.patch
|
patch -p0 < $PATCH_DIR/cctools-ld64-llvm-3.7.patch
|
||||||
patch -p0 < $PATCH_DIR/cctools-ld64-abs-warning.patch
|
patch -p0 < $PATCH_DIR/cctools-ld64-abs-warning.patch
|
||||||
patch -p0 < $PATCH_DIR/cctools-ld64-rpath.patch
|
patch -p0 < $PATCH_DIR/cctools-ld64-rpath.patch
|
||||||
|
pushd .. &>/dev/null
|
||||||
|
patch -p0 < $PATCH_DIR/cctools-ld64-otool-disasm.patch
|
||||||
|
chmod +x tools/fix_liblto.sh
|
||||||
|
popd &>/dev/null
|
||||||
echo ""
|
echo ""
|
||||||
CONFFLAGS="--prefix=$TARGET_DIR --target=x86_64-apple-$TARGET"
|
CONFFLAGS="--prefix=$TARGET_DIR --target=x86_64-apple-$TARGET"
|
||||||
[ -n "$DISABLE_LTO_SUPPORT" ] && CONFFLAGS+=" --enable-lto=no"
|
[ -n "$DISABLE_LTO_SUPPORT" ] && CONFFLAGS+=" --enable-lto=no"
|
||||||
|
139
patches/cctools-ld64-otool-disasm.patch
Normal file
139
patches/cctools-ld64-otool-disasm.patch
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
diff --git cctools/libstuff/llvm.c cctools/libstuff/llvm.c
|
||||||
|
index 447140d..26b0a66 100644
|
||||||
|
--- cctools/libstuff/llvm.c
|
||||||
|
+++ cctools/libstuff/llvm.c
|
||||||
|
@@ -14,7 +14,11 @@
|
||||||
|
* plan to include it (along with the current libLTO APIs) in a generic
|
||||||
|
* libLLVM.dylib.
|
||||||
|
*/
|
||||||
|
+#ifdef __APPLE__
|
||||||
|
+#define LIB_LLVM "libLTO.dylib"
|
||||||
|
+#else
|
||||||
|
#define LIB_LLVM "libLTO.so"
|
||||||
|
+#endif /* __APPLE__ */
|
||||||
|
|
||||||
|
static int tried_to_load_llvm = 0;
|
||||||
|
static void *llvm_handle = NULL;
|
||||||
|
@@ -62,12 +66,20 @@ static void load_llvm(void)
|
||||||
|
p[1] = '\0';
|
||||||
|
llvm_path = makestr(prefix, "../lib/" LIB_LLVM, NULL);
|
||||||
|
|
||||||
|
+#ifdef __APPLE__
|
||||||
|
llvm_handle = dlopen(llvm_path, RTLD_NOW);
|
||||||
|
if(llvm_handle == NULL){
|
||||||
|
free(llvm_path);
|
||||||
|
llvm_path = NULL;
|
||||||
|
- llvm_handle = dlopen("/usr/lib/llvm/" LIB_LLVM, RTLD_NOW);
|
||||||
|
+ llvm_handle = dlopen("/Applications/Xcode.app/Contents/"
|
||||||
|
+ "Developer/Toolchains/XcodeDefault."
|
||||||
|
+ "xctoolchain/usr/lib/" LIB_LLVM,
|
||||||
|
+ RTLD_NOW);
|
||||||
|
}
|
||||||
|
+#else
|
||||||
|
+ llvm_handle = dlopen(LIB_LLVM, RTLD_NOW);
|
||||||
|
+#endif /* __APPLE__ */
|
||||||
|
+
|
||||||
|
if(llvm_handle == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
@@ -80,6 +92,13 @@ static void load_llvm(void)
|
||||||
|
createCPU = dlsym(llvm_handle, "LLVMCreateDisasmCPU");
|
||||||
|
version = dlsym(llvm_handle, "lto_get_version");
|
||||||
|
|
||||||
|
+#ifndef __APPLE__
|
||||||
|
+ if(create == NULL){
|
||||||
|
+ fprintf(stderr, "Your " LIB_LLVM " lacks required symbols.\n");
|
||||||
|
+ fprintf(stderr, "Please run: tools/fix_liblto.sh (or http://git.io/AyZP) to fix libLTO.\n");
|
||||||
|
+ }
|
||||||
|
+#endif /* __APPLE__ */
|
||||||
|
+
|
||||||
|
if(create == NULL ||
|
||||||
|
dispose == NULL ||
|
||||||
|
disasm == NULL){
|
||||||
|
diff --git tools/fix_liblto.sh tools/fix_liblto.sh
|
||||||
|
new file mode 100755
|
||||||
|
index 0000000..6cb05e8
|
||||||
|
--- /dev/null
|
||||||
|
+++ tools/fix_liblto.sh
|
||||||
|
@@ -0,0 +1,81 @@
|
||||||
|
+#!/usr/bin/env bash
|
||||||
|
+## http://llvm.org/PR22677
|
||||||
|
+
|
||||||
|
+pushd "${0%/*}" &>/dev/null
|
||||||
|
+
|
||||||
|
+if [ $(uname -s) == "Darwin" ]; then
|
||||||
|
+ echo "Darwin works out of the box."
|
||||||
|
+ exit 1
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if [ -z "$LLVM_CONFIG" ]; then
|
||||||
|
+ LLVM_CONFIG=llvm-config
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+which $LLVM_CONFIG &>/dev/null
|
||||||
|
+
|
||||||
|
+if [ $? -ne 0 ]; then
|
||||||
|
+ echo -n "Cannot find $LLVM_CONFIG, you may want to try " 1>&2
|
||||||
|
+ echo "LLVM_CONFIG=llvm-config<suffix> $0" 1>&2
|
||||||
|
+ exit 1
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+LIBDIR=$($LLVM_CONFIG --libdir)
|
||||||
|
+INCDIR=$($LLVM_CONFIG --includedir)
|
||||||
|
+
|
||||||
|
+V="$(readelf -Ws $LIBDIR/libLTO.so 2>/dev/null | grep LLVMCreateDisasm)"
|
||||||
|
+
|
||||||
|
+if [ -n "$V" ]; then
|
||||||
|
+ echo "No fix needed."
|
||||||
|
+ exit 1
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+VERSION=$($LLVM_CONFIG --version | awk -F \. {'print $1$2'} | sed 's/svn//g')
|
||||||
|
+
|
||||||
|
+if [ $VERSION -lt 34 ]; then
|
||||||
|
+ echo "This tool requires LLVM 3.4 or later." 1>&2
|
||||||
|
+ exit 1
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+LIBS=$($LLVM_CONFIG --libs all)
|
||||||
|
+SYSLIBS=$($LLVM_CONFIG --system-libs 2>/dev/null || echo "-ldl -lz -ltinfo -pthread")
|
||||||
|
+CXXFLAGS=$($LLVM_CONFIG --cxxflags)
|
||||||
|
+
|
||||||
|
+if [ $VERSION -ge 35 ]; then
|
||||||
|
+ SYSLIBS+=" -ledit"
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+set -e
|
||||||
|
+TMP=$(mktemp -d)
|
||||||
|
+set +e
|
||||||
|
+
|
||||||
|
+pushd $TMP &>/dev/null
|
||||||
|
+wget https://raw.githubusercontent.com/llvm-mirror/llvm/release_$VERSION/tools/lto/lto.cpp
|
||||||
|
+wget https://raw.githubusercontent.com/llvm-mirror/llvm/release_$VERSION/tools/lto/LTODisassembler.cpp
|
||||||
|
+wget https://raw.githubusercontent.com/llvm-mirror/llvm/release_$VERSION/tools/lto/lto.exports
|
||||||
|
+
|
||||||
|
+echo "{" > lto.ls
|
||||||
|
+echo " global:" >> lto.ls
|
||||||
|
+while read p; do
|
||||||
|
+ echo " $p;" >> lto.ls
|
||||||
|
+done < lto.exports
|
||||||
|
+echo " LLVM*;" >> lto.ls
|
||||||
|
+echo " local: *;" >> lto.ls
|
||||||
|
+echo "};" >> lto.ls
|
||||||
|
+popd &>/dev/null
|
||||||
|
+
|
||||||
|
+set -x
|
||||||
|
+
|
||||||
|
+clang++ -shared \
|
||||||
|
+ -L$LIBDIR -I$INCDIR -Wl,--whole-archive $LIBS -Wl,--no-whole-archive $SYSLIBS \
|
||||||
|
+ $CXXFLAGS $TMP/lto.cpp $TMP/LTODisassembler.cpp -Wl,-version-script,$TMP/lto.ls \
|
||||||
|
+ -Wl,-no-undefined -fno-rtti -fPIC -o libLTO.so
|
||||||
|
+
|
||||||
|
+rm -r $TMP
|
||||||
|
+
|
||||||
|
+mv -f libLTO.so $LIBDIR || {
|
||||||
|
+ set +x
|
||||||
|
+ echo "Try again as root."
|
||||||
|
+ echo "Or run the following command by hand: mv $PWD/libLTO.so $LIBDIR"
|
||||||
|
+ exit 1
|
||||||
|
+}
|
Loading…
Reference in New Issue
Block a user