@@ -249,6 +249,12 @@ supported_target() {
249249 return 1
250250 fi
251251 ;;
252+ * -darwin-user)
253+ if test " $darwin " ! = " yes" ; then
254+ print_error " Target '$target ' is only available on a Darwin host"
255+ return 1
256+ fi
257+ ;;
252258 * )
253259 print_error " Invalid target name '$target '"
254260 return 1
@@ -390,6 +396,7 @@ cocoa="no"
390396softmmu=" yes"
391397linux_user=" no"
392398bsd_user=" no"
399+ darwin_user=" no"
393400blobs=" yes"
394401pkgversion=" "
395402pie=" "
@@ -766,6 +773,7 @@ OpenBSD)
766773Darwin)
767774 bsd=" yes"
768775 darwin=" yes"
776+ darwin_user=" yes"
769777 hax=" yes"
770778 hvf=" yes"
771779 LDFLAGS_SHARED=" -bundle -undefined dynamic_lookup"
@@ -1119,6 +1127,7 @@ for opt do
11191127 --disable-user)
11201128 linux_user=" no" ;
11211129 bsd_user=" no" ;
1130+ darwin_user=" no" ;
11221131 ;;
11231132 --enable-user) ;;
11241133 --disable-linux-user) linux_user=" no"
@@ -1129,6 +1138,10 @@ for opt do
11291138 ;;
11301139 --enable-bsd-user) bsd_user=" yes"
11311140 ;;
1141+ --disable-darwin-user) darwin_user=" no"
1142+ ;;
1143+ --enable-darwin-user) darwin_user=" yes"
1144+ ;;
11321145 --enable-pie) pie=" yes"
11331146 ;;
11341147 --disable-pie) pie=" no"
@@ -1439,6 +1452,7 @@ QEMU_CFLAGS="$CPU_CFLAGS $QEMU_CFLAGS"
14391452if [ " $ARCH " = " unknown" ]; then
14401453 bsd_user=" no"
14411454 linux_user=" no"
1455+ darwin_user=" no"
14421456fi
14431457
14441458default_target_list=" "
@@ -1454,6 +1468,10 @@ fi
14541468if [ " $bsd_user " = " yes" ]; then
14551469 mak_wilds=" ${mak_wilds} $source_path /default-configs/*-bsd-user.mak"
14561470fi
1471+ if [ " $darwin_user " = " yes" ]; then
1472+ mak_wilds=" ${mak_wilds} $source_path /default-configs/*-darwin-user.mak"
1473+ fi
1474+
14571475
14581476for config in $mak_wilds ; do
14591477 default_target_list=" ${default_target_list} $( basename " $config " .mak) "
@@ -1548,6 +1566,7 @@ disabled with --disable-FEATURE, default is enabled if available:
15481566 user supported user emulation targets
15491567 linux-user all linux usermode emulation targets
15501568 bsd-user all BSD usermode emulation targets
1569+ darwin-user all MacOS usermode emulation targets
15511570 docs build documentation
15521571 guest-agent build the QEMU Guest Agent
15531572 guest-agent-msi build guest agent Windows MSI installation package
@@ -5591,7 +5610,7 @@ if test "$cpu" = "s390x" ; then
55915610fi
55925611
55935612# Probe for the need for relocating the user-only binary.
5594- if ( [ " $linux_user " = yes ] || [ " $bsd_user " = yes ] ) && [ " $pie " = no ]; then
5613+ if ( [ " $linux_user " = yes ] || [ " $bsd_user " = yes ] || [ " $darwin_user " = yes ] ) && [ " $pie " = no ]; then
55955614 textseg_addr=
55965615 case " $cpu " in
55975616 arm | i386 | ppc* | s390* | sparc* | x86_64 | x32)
@@ -5604,31 +5623,53 @@ if ( [ "$linux_user" = yes ] || [ "$bsd_user" = yes ] ) && [ "$pie" = no ]; then
56045623 textseg_addr=0x60000000
56055624 ;;
56065625 esac
5626+
56075627 if [ -n " $textseg_addr " ]; then
56085628 cat > $TMPC << EOF
56095629 int main(void) { return 0; }
56105630EOF
5611- textseg_ldflags=" -Wl,-Ttext-segment=$textseg_addr "
5612- if ! compile_prog " " " $textseg_ldflags " ; then
5613- # In case ld does not support -Ttext-segment, edit the default linker
5614- # script via sed to set the .text start addr. This is needed on FreeBSD
5615- # at least.
5616- if ! $ld --verbose > /dev/null 2>&1 ; then
5617- error_exit \
5618- " We need to link the QEMU user mode binaries at a" \
5619- " specific text address. Unfortunately your linker" \
5620- " doesn't support either the -Ttext-segment option or" \
5621- " printing the default linker script with --verbose." \
5622- " If you don't want the user mode binaries, pass the" \
5623- " --disable-user option to configure."
5624- fi
5631+ # 64bit macOS reserves 4GB for page zero to catch truncated pointer to int casts.
5632+ # Follow suggested Wine configuration from:
5633+ # https://stackoverflow.com/questions/46916112/osx-ld-why-does-pagezero-size-default-to-4gb-on-64b-osx
5634+ if [ " $darwin_user " = yes ] ; then
5635+ pz_size_flag=" ,-pagezero_size,0x1000"
5636+ else
5637+ pz_size_flag=" "
5638+ fi
56255639
5640+ # Check three different sets of ld flags:
5641+ # default_... for standard gnu ld (Linux)
5642+ # clang_... for llvm clang
5643+ # macos_... for macOS built-in ld
5644+ # If none of the above options are supported, edit the default linker
5645+ # script via sed to set the .text start addr. This is needed on FreeBSD
5646+ # at least.
5647+ default_ldflags=" -Wl,-Ttext-segment=$textseg_addr "
5648+ clang_ldflags=" -Wl,-image-base,${textseg_addr}${pz_size_flag} "
5649+ macos_ldflags=" -Wl,-image_base,${textseg_addr}${pz_size_flag} "
5650+
5651+ if compile_prog " " " $default_ldflags " ; then
5652+ textseg_ldflags=" $default_ldflags "
5653+ elif compile_prog " " " $clang_ldflags " ; then
5654+ textseg_ldflags=" $clang_ldflags "
5655+ elif compile_prog " " " $macos_ldflags " ; then
5656+ textseg_ldflags=" $macos_ldflags "
5657+ elif $ld --verbose > /dev/null 2>&1 ; then
56265658 $ld --verbose | sed \
56275659 -e ' 1,/==================================================/d' \
56285660 -e ' /==================================================/,$d' \
56295661 -e " s/[.] = [0-9a-fx]* [+] SIZEOF_HEADERS/. = $textseg_addr + SIZEOF_HEADERS/" \
56305662 -e " s/__executable_start = [0-9a-fx]*/__executable_start = $textseg_addr /" > config-host.ld
56315663 textseg_ldflags=" -Wl,-T../config-host.ld"
5664+ else
5665+ error_exit \
5666+ " We need to link the QEMU user mode binaries at a" \
5667+ " specific text address. Unfortunately your linker" \
5668+ " doesn't support either the -Ttext-segment option," \
5669+ " -image_base, -image-base, or printing the default" \
5670+ " linker script with --verbose." \
5671+ " If you don't want the user mode binaries, pass the" \
5672+ " --disable-user option to configure."
56325673 fi
56335674 fi
56345675fi
@@ -6695,6 +6736,7 @@ target_softmmu="no"
66956736target_user_only=" no"
66966737target_linux_user=" no"
66976738target_bsd_user=" no"
6739+ target_darwin_user=" no"
66986740case " $target " in
66996741 ${target_name} -softmmu)
67006742 target_softmmu=" yes"
@@ -6707,6 +6749,10 @@ case "$target" in
67076749 target_user_only=" yes"
67086750 target_bsd_user=" yes"
67096751 ;;
6752+ ${target_name} -darwin-user)
6753+ target_user_only=" yes"
6754+ target_darwin_user=" yes"
6755+ ;;
67106756 * )
67116757 error_exit " Target '$target ' not recognised"
67126758 exit 1
69547000if test " $target_linux_user " = " yes" ; then
69557001 echo " CONFIG_LINUX_USER=y" >> $config_target_mak
69567002fi
7003+ if test " $target_darwin_user " = " yes" ; then
7004+ echo " CONFIG_DARWIN_USER=y" >> $config_target_mak
7005+ fi
69577006list=" "
69587007if test ! -z " $gdb_xml_files " ; then
69597008 for x in $gdb_xml_files ; do
@@ -7068,7 +7117,7 @@ if test "$gprof" = "yes" ; then
70687117 fi
70697118fi
70707119
7071- if test " $target_linux_user " = " yes" -o " $target_bsd_user " = " yes" ; then
7120+ if test " $target_linux_user " = " yes" -o " $target_bsd_user " = " yes" -o " $target_darwin_user " = " yes " ; then
70727121 ldflags=" $ldflags $textseg_ldflags "
70737122fi
70747123
0 commit comments