Commit 4e548e73 by Ian Lance Taylor

libbacktrace: add preliminary Mach-O support

parent 929d6205
...@@ -57,6 +57,7 @@ BACKTRACE_FILES = \ ...@@ -57,6 +57,7 @@ BACKTRACE_FILES = \
FORMAT_FILES = \ FORMAT_FILES = \
elf.c \ elf.c \
macho.c \
pecoff.c \ pecoff.c \
unknown.c \ unknown.c \
xcoff.c xcoff.c
...@@ -85,18 +86,28 @@ libbacktrace_la_DEPENDENCIES = $(libbacktrace_la_LIBADD) ...@@ -85,18 +86,28 @@ libbacktrace_la_DEPENDENCIES = $(libbacktrace_la_LIBADD)
# Testsuite. # Testsuite.
# Add test to this variable, if you want it to be build. # Add a test to this variable if you want it to be built.
check_PROGRAMS = check_PROGRAMS =
# Add test to this variable, if you want it to be run. # Add a test to this variable if you want it to be run.
TESTS = TESTS =
# Add test to this variable, if you want it to be build and run. # Add a test to this variable if you want it to be built and run.
BUILDTESTS = BUILDTESTS =
# Add a file to this variable if you want it to be built for testing.
check_DATA =
# Flags to use when compiling test programs. # Flags to use when compiling test programs.
libbacktrace_TEST_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) -g libbacktrace_TEST_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) -g
if HAVE_DSYMUTIL
%.dSYM: %
$(DSYMUTIL) $<
endif HAVE_DSYMUTIL
if NATIVE if NATIVE
check_LTLIBRARIES = libbacktrace_alloc.la check_LTLIBRARIES = libbacktrace_alloc.la
...@@ -164,6 +175,12 @@ test_elf_64_LDADD = libbacktrace_noformat.la elf_64.lo ...@@ -164,6 +175,12 @@ test_elf_64_LDADD = libbacktrace_noformat.la elf_64.lo
BUILDTESTS += test_elf_64 BUILDTESTS += test_elf_64
test_macho_SOURCES = test_format.c testlib.c
test_macho_CFLAGS = $(libbacktrace_TEST_CFLAGS)
test_macho_LDADD = libbacktrace_noformat.la macho.lo
BUILDTESTS += test_macho
test_xcoff_32_SOURCES = test_format.c testlib.c test_xcoff_32_SOURCES = test_format.c testlib.c
test_xcoff_32_CFLAGS = $(libbacktrace_TEST_CFLAGS) test_xcoff_32_CFLAGS = $(libbacktrace_TEST_CFLAGS)
test_xcoff_32_LDADD = libbacktrace_noformat.la xcoff_32.lo test_xcoff_32_LDADD = libbacktrace_noformat.la xcoff_32.lo
...@@ -221,6 +238,10 @@ allocfail.sh: allocfail ...@@ -221,6 +238,10 @@ allocfail.sh: allocfail
TESTS += allocfail.sh TESTS += allocfail.sh
if HAVE_DSYMUTIL
check_DATA += allocfail.dSYM
endif HAVE_DSYMUTIL
if HAVE_ELF if HAVE_ELF
if HAVE_OBJCOPY_DEBUGLINK if HAVE_OBJCOPY_DEBUGLINK
...@@ -253,6 +274,10 @@ btest_LDADD = libbacktrace.la ...@@ -253,6 +274,10 @@ btest_LDADD = libbacktrace.la
BUILDTESTS += btest BUILDTESTS += btest
if HAVE_DSYMUTIL
check_DATA += btest.dSYM
endif HAVE_DSYMUTIL
if HAVE_ELF if HAVE_ELF
btest_lto_SOURCES = btest.c testlib.c btest_lto_SOURCES = btest.c testlib.c
...@@ -269,6 +294,10 @@ btest_alloc_LDADD = libbacktrace_alloc.la ...@@ -269,6 +294,10 @@ btest_alloc_LDADD = libbacktrace_alloc.la
BUILDTESTS += btest_alloc BUILDTESTS += btest_alloc
if HAVE_DSYMUTIL
check_DATA += btest_alloc.dSYM
endif HAVE_DSYMUTIL
if HAVE_DWZ if HAVE_DWZ
%_dwz: % %_dwz: %
...@@ -295,12 +324,20 @@ stest_LDADD = libbacktrace.la ...@@ -295,12 +324,20 @@ stest_LDADD = libbacktrace.la
BUILDTESTS += stest BUILDTESTS += stest
if HAVE_DSYMUTIL
check_DATA += stest.dSYM
endif HAVE_DSYMUTIL
stest_alloc_SOURCES = $(stest_SOURCES) stest_alloc_SOURCES = $(stest_SOURCES)
stest_alloc_CFLAGS = $(libbacktrace_TEST_CFLAGS) stest_alloc_CFLAGS = $(libbacktrace_TEST_CFLAGS)
stest_alloc_LDADD = libbacktrace_alloc.la stest_alloc_LDADD = libbacktrace_alloc.la
BUILDTESTS += stest_alloc BUILDTESTS += stest_alloc
if HAVE_DSYMUTIL
check_DATA += stest_alloc.dSYM
endif HAVE_DSYMUTIL
if HAVE_ELF if HAVE_ELF
ztest_SOURCES = ztest.c testlib.c ztest_SOURCES = ztest.c testlib.c
...@@ -330,10 +367,18 @@ edtest_LDADD = libbacktrace.la ...@@ -330,10 +367,18 @@ edtest_LDADD = libbacktrace.la
BUILDTESTS += edtest BUILDTESTS += edtest
if HAVE_DSYMUTIL
check_DATA += edtest.dSYM
endif HAVE_DSYMUTIL
edtest_alloc_SOURCES = $(edtest_SOURCES) edtest_alloc_SOURCES = $(edtest_SOURCES)
edtest_alloc_CFLAGS = $(libbacktrace_TEST_CFLAGS) edtest_alloc_CFLAGS = $(libbacktrace_TEST_CFLAGS)
edtest_alloc_LDADD = libbacktrace_alloc.la edtest_alloc_LDADD = libbacktrace_alloc.la
if HAVE_DSYMUTIL
check_DATA += edtest_alloc.dSYM
endif HAVE_DSYMUTIL
BUILDTESTS += edtest_alloc BUILDTESTS += edtest_alloc
edtest2_build.c: gen_edtest2_build; @true edtest2_build.c: gen_edtest2_build; @true
...@@ -350,12 +395,20 @@ ttest_SOURCES = ttest.c testlib.c ...@@ -350,12 +395,20 @@ ttest_SOURCES = ttest.c testlib.c
ttest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -pthread ttest_CFLAGS = $(libbacktrace_TEST_CFLAGS) -pthread
ttest_LDADD = libbacktrace.la ttest_LDADD = libbacktrace.la
if HAVE_DSYMUTIL
check_DATA += ttest.dSYM
endif HAVE_DSYMUTIL
BUILDTESTS += ttest_alloc BUILDTESTS += ttest_alloc
ttest_alloc_SOURCES = $(ttest_SOURCES) ttest_alloc_SOURCES = $(ttest_SOURCES)
ttest_alloc_CFLAGS = $(ttest_CFLAGS) ttest_alloc_CFLAGS = $(ttest_CFLAGS)
ttest_alloc_LDADD = libbacktrace_alloc.la ttest_alloc_LDADD = libbacktrace_alloc.la
if HAVE_DSYMUTIL
check_DATA += ttest_alloc.dSYM
endif HAVE_DSYMUTIL
endif HAVE_PTHREAD endif HAVE_PTHREAD
if HAVE_OBJCOPY_DEBUGLINK if HAVE_OBJCOPY_DEBUGLINK
...@@ -410,12 +463,20 @@ dwarf5_LDADD = libbacktrace.la ...@@ -410,12 +463,20 @@ dwarf5_LDADD = libbacktrace.la
BUILDTESTS += dwarf5 BUILDTESTS += dwarf5
if HAVE_DSYMUTIL
check_DATA += dwarf5.dSYM
endif HAVE_DSYMUTIL
dwarf5_alloc_SOURCES = $(dwarf5_SOURCES) dwarf5_alloc_SOURCES = $(dwarf5_SOURCES)
dwarf5_alloc_CFLAGS = $(dwarf5_CFLAGS) dwarf5_alloc_CFLAGS = $(dwarf5_CFLAGS)
dwarf5_alloc_LDADD = libbacktrace_alloc.la dwarf5_alloc_LDADD = libbacktrace_alloc.la
BUILDTESTS += dwarf5_alloc BUILDTESTS += dwarf5_alloc
if HAVE_DSYMUTIL
check_DATA += dwarf5_alloc.dSYM
endif HAVE_DSYMUTIL
endif endif
endif NATIVE endif NATIVE
...@@ -447,6 +508,7 @@ btest.lo: filenames.h backtrace.h backtrace-supported.h ...@@ -447,6 +508,7 @@ btest.lo: filenames.h backtrace.h backtrace-supported.h
dwarf.lo: config.h filenames.h backtrace.h internal.h dwarf.lo: config.h filenames.h backtrace.h internal.h
elf.lo: config.h backtrace.h internal.h elf.lo: config.h backtrace.h internal.h
fileline.lo: config.h backtrace.h internal.h fileline.lo: config.h backtrace.h internal.h
macho.lo: config.h backtrace.h internal.h
mmap.lo: config.h backtrace.h internal.h mmap.lo: config.h backtrace.h internal.h
mmapio.lo: config.h backtrace.h internal.h mmapio.lo: config.h backtrace.h internal.h
nounwind.lo: config.h internal.h nounwind.lo: config.h internal.h
......
...@@ -51,6 +51,9 @@ ...@@ -51,6 +51,9 @@
/* Define to 1 if you have the `lstat' function. */ /* Define to 1 if you have the `lstat' function. */
#undef HAVE_LSTAT #undef HAVE_LSTAT
/* Define to 1 if you have the <mach-o/dyld.h> header file. */
#undef HAVE_MACH_O_DYLD_H
/* Define to 1 if you have the <memory.h> header file. */ /* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H #undef HAVE_MEMORY_H
......
...@@ -635,6 +635,8 @@ LTLIBOBJS ...@@ -635,6 +635,8 @@ LTLIBOBJS
LIBOBJS LIBOBJS
NATIVE_FALSE NATIVE_FALSE
NATIVE_TRUE NATIVE_TRUE
HAVE_DSYMUTIL_FALSE
HAVE_DSYMUTIL_TRUE
HAVE_OBJCOPY_DEBUGLINK_FALSE HAVE_OBJCOPY_DEBUGLINK_FALSE
HAVE_OBJCOPY_DEBUGLINK_TRUE HAVE_OBJCOPY_DEBUGLINK_TRUE
READELF READELF
...@@ -799,7 +801,8 @@ LDFLAGS ...@@ -799,7 +801,8 @@ LDFLAGS
LIBS LIBS
CPPFLAGS CPPFLAGS
CPP CPP
OBJCOPY' OBJCOPY
DSYMUTIL'
# Initialize some variables set by options. # Initialize some variables set by options.
...@@ -1452,6 +1455,7 @@ Some influential environment variables: ...@@ -1452,6 +1455,7 @@ Some influential environment variables:
you have headers in a nonstandard directory <include dir> you have headers in a nonstandard directory <include dir>
CPP C preprocessor CPP C preprocessor
OBJCOPY location of objcopy OBJCOPY location of objcopy
DSYMUTIL location of dsymutil
Use these variables to override the choices made by `configure' or to help Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations. it to find libraries and programs with nonstandard names/locations.
...@@ -11265,7 +11269,7 @@ else ...@@ -11265,7 +11269,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF cat > conftest.$ac_ext <<_LT_EOF
#line 11268 "configure" #line 11272 "configure"
#include "confdefs.h" #include "confdefs.h"
#if HAVE_DLFCN_H #if HAVE_DLFCN_H
...@@ -11371,7 +11375,7 @@ else ...@@ -11371,7 +11375,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF cat > conftest.$ac_ext <<_LT_EOF
#line 11374 "configure" #line 11378 "configure"
#include "confdefs.h" #include "confdefs.h"
#if HAVE_DLFCN_H #if HAVE_DLFCN_H
...@@ -12176,6 +12180,7 @@ FORMAT_FILE= ...@@ -12176,6 +12180,7 @@ FORMAT_FILE=
backtrace_supports_data=yes backtrace_supports_data=yes
case "$libbacktrace_cv_sys_filetype" in case "$libbacktrace_cv_sys_filetype" in
elf*) FORMAT_FILE="elf.lo" ;; elf*) FORMAT_FILE="elf.lo" ;;
macho) FORMAT_FILE="macho.lo" ;;
pecoff) FORMAT_FILE="pecoff.lo" pecoff) FORMAT_FILE="pecoff.lo"
backtrace_supports_data=no backtrace_supports_data=no
;; ;;
...@@ -12355,6 +12360,20 @@ $as_echo "#define HAVE_DL_ITERATE_PHDR 1" >>confdefs.h ...@@ -12355,6 +12360,20 @@ $as_echo "#define HAVE_DL_ITERATE_PHDR 1" >>confdefs.h
fi fi
# Check for header file for Mach-O image functions.
for ac_header in mach-o/dyld.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "mach-o/dyld.h" "ac_cv_header_mach_o_dyld_h" "$ac_includes_default"
if test "x$ac_cv_header_mach_o_dyld_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_MACH_O_DYLD_H 1
_ACEOF
fi
done
# Check for loadquery. # Check for loadquery.
for ac_header in sys/ldr.h for ac_header in sys/ldr.h
do : do :
...@@ -12840,6 +12859,8 @@ if ${libbacktrace_cv_objcopy_debuglink+:} false; then : ...@@ -12840,6 +12859,8 @@ if ${libbacktrace_cv_objcopy_debuglink+:} false; then :
else else
if test -n "${with_target_subdir}"; then if test -n "${with_target_subdir}"; then
libbacktrace_cv_objcopy_debuglink=no libbacktrace_cv_objcopy_debuglink=no
elif ! test -n "${OBJCOPY}"; then
libbacktrace_cv_objcopy_debuglink=no
elif ${OBJCOPY} --add-gnu-debuglink=x /bin/ls /tmp/ls$$; then elif ${OBJCOPY} --add-gnu-debuglink=x /bin/ls /tmp/ls$$; then
rm -f /tmp/ls$$ rm -f /tmp/ls$$
libbacktrace_cv_objcopy_debuglink=yes libbacktrace_cv_objcopy_debuglink=yes
...@@ -12858,6 +12879,53 @@ else ...@@ -12858,6 +12879,53 @@ else
fi fi
# Extract the first word of "dsymutil", so it can be a program name with args.
set dummy dsymutil; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_DSYMUTIL+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$DSYMUTIL"; then
ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_DSYMUTIL="dsymutil"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
fi
fi
DSYMUTIL=$ac_cv_prog_DSYMUTIL
if test -n "$DSYMUTIL"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
$as_echo "$DSYMUTIL" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test -n "${DSYMUTIL}"; then
HAVE_DSYMUTIL_TRUE=
HAVE_DSYMUTIL_FALSE='#'
else
HAVE_DSYMUTIL_TRUE='#'
HAVE_DSYMUTIL_FALSE=
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether tests can run" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether tests can run" >&5
$as_echo_n "checking whether tests can run... " >&6; } $as_echo_n "checking whether tests can run... " >&6; }
if ${libbacktrace_cv_sys_native+:} false; then : if ${libbacktrace_cv_sys_native+:} false; then :
...@@ -13070,6 +13138,10 @@ if test -z "${HAVE_OBJCOPY_DEBUGLINK_TRUE}" && test -z "${HAVE_OBJCOPY_DEBUGLINK ...@@ -13070,6 +13138,10 @@ if test -z "${HAVE_OBJCOPY_DEBUGLINK_TRUE}" && test -z "${HAVE_OBJCOPY_DEBUGLINK
as_fn_error $? "conditional \"HAVE_OBJCOPY_DEBUGLINK\" was never defined. as_fn_error $? "conditional \"HAVE_OBJCOPY_DEBUGLINK\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5 Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi fi
if test -z "${HAVE_DSYMUTIL_TRUE}" && test -z "${HAVE_DSYMUTIL_FALSE}"; then
as_fn_error $? "conditional \"HAVE_DSYMUTIL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${NATIVE_TRUE}" && test -z "${NATIVE_FALSE}"; then if test -z "${NATIVE_TRUE}" && test -z "${NATIVE_FALSE}"; then
as_fn_error $? "conditional \"NATIVE\" was never defined. as_fn_error $? "conditional \"NATIVE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5 Usually this means the macro was only invoked conditionally." "$LINENO" 5
......
...@@ -238,6 +238,7 @@ FORMAT_FILE= ...@@ -238,6 +238,7 @@ FORMAT_FILE=
backtrace_supports_data=yes backtrace_supports_data=yes
case "$libbacktrace_cv_sys_filetype" in case "$libbacktrace_cv_sys_filetype" in
elf*) FORMAT_FILE="elf.lo" ;; elf*) FORMAT_FILE="elf.lo" ;;
macho) FORMAT_FILE="macho.lo" ;;
pecoff) FORMAT_FILE="pecoff.lo" pecoff) FORMAT_FILE="pecoff.lo"
backtrace_supports_data=no backtrace_supports_data=no
;; ;;
...@@ -346,6 +347,9 @@ if test "$have_dl_iterate_phdr" = "yes"; then ...@@ -346,6 +347,9 @@ if test "$have_dl_iterate_phdr" = "yes"; then
AC_DEFINE(HAVE_DL_ITERATE_PHDR, 1, [Define if dl_iterate_phdr is available.]) AC_DEFINE(HAVE_DL_ITERATE_PHDR, 1, [Define if dl_iterate_phdr is available.])
fi fi
# Check for header file for Mach-O image functions.
AC_CHECK_HEADERS(mach-o/dyld.h)
# Check for loadquery. # Check for loadquery.
AC_CHECK_HEADERS(sys/ldr.h) AC_CHECK_HEADERS(sys/ldr.h)
if test "$ac_cv_header_sys_ldr_h" = "no"; then if test "$ac_cv_header_sys_ldr_h" = "no"; then
...@@ -490,6 +494,8 @@ AC_CACHE_CHECK([whether objcopy supports debuglink], ...@@ -490,6 +494,8 @@ AC_CACHE_CHECK([whether objcopy supports debuglink],
[libbacktrace_cv_objcopy_debuglink], [libbacktrace_cv_objcopy_debuglink],
[if test -n "${with_target_subdir}"; then [if test -n "${with_target_subdir}"; then
libbacktrace_cv_objcopy_debuglink=no libbacktrace_cv_objcopy_debuglink=no
elif ! test -n "${OBJCOPY}"; then
libbacktrace_cv_objcopy_debuglink=no
elif ${OBJCOPY} --add-gnu-debuglink=x /bin/ls /tmp/ls$$; then elif ${OBJCOPY} --add-gnu-debuglink=x /bin/ls /tmp/ls$$; then
rm -f /tmp/ls$$ rm -f /tmp/ls$$
libbacktrace_cv_objcopy_debuglink=yes libbacktrace_cv_objcopy_debuglink=yes
...@@ -498,6 +504,10 @@ else ...@@ -498,6 +504,10 @@ else
fi]) fi])
AM_CONDITIONAL(HAVE_OBJCOPY_DEBUGLINK, test "$libbacktrace_cv_objcopy_debuglink" = yes) AM_CONDITIONAL(HAVE_OBJCOPY_DEBUGLINK, test "$libbacktrace_cv_objcopy_debuglink" = yes)
AC_ARG_VAR(DSYMUTIL, [location of dsymutil])
AC_CHECK_PROG(DSYMUTIL, dsymutil, dsymutil)
AM_CONDITIONAL(HAVE_DSYMUTIL, test -n "${DSYMUTIL}")
AC_CACHE_CHECK([whether tests can run], AC_CACHE_CHECK([whether tests can run],
[libbacktrace_cv_sys_native], [libbacktrace_cv_sys_native],
[AC_RUN_IFELSE([AC_LANG_PROGRAM([], [return 0;])], [AC_RUN_IFELSE([AC_LANG_PROGRAM([], [return 0;])],
......
...@@ -5,4 +5,9 @@ ...@@ -5,4 +5,9 @@
/\144\206/ { if (NR == 1) { print "pecoff"; exit } } /\144\206/ { if (NR == 1) { print "pecoff"; exit } }
/\001\337/ { if (NR == 1) { print "xcoff32"; exit } } /\001\337/ { if (NR == 1) { print "xcoff32"; exit } }
/\001\367/ { if (NR == 1) { print "xcoff64"; exit } } /\001\367/ { if (NR == 1) { print "xcoff64"; exit } }
/\376\355\372\316/ { if (NR == 1) { print "macho"; exit } }
/\316\372\355\376/ { if (NR == 1) { print "macho"; exit } }
/\376\355\372\317/ { if (NR == 1) { print "macho"; exit } }
/\317\372\355\376/ { if (NR == 1) { print "macho"; exit } }
/\312\376\272\276/ { if (NR == 1) { print "macho"; exit } }
/\276\272\376\312/ { if (NR == 1) { print "macho"; exit } }
This diff is collapsed. Click to expand it.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment