diff mbox series

[v2,02/18] configure: Disable W^X on OpenBSD

Message ID 20190129175403.18017-3-philmd@redhat.com
State New
Headers show
Series OpenBSD: Enable qtesting | expand

Commit Message

Philippe Mathieu-Daudé Jan. 29, 2019, 5:53 p.m. UTC
Since OpenBSD 6.0 [1], W^X is enforced by default [2].
TCG requires WX access. Disable W^X if it is available.
This fixes:

  # lm32-softmmu/qemu-system-lm32
  Could not allocate dynamic translator buffer

  # sysctl kern.wxabort=1
  kern.wxabort: 0 -> 1
  # lm32-softmmu/qemu-system-lm32
  mmap: Not supported
  Abort trap (core dumped)
  # gdb -q lm32-softmmu/qemu-system-lm32 qemu-system-lm32.core
  (gdb) bt
  #0  0x000017e3c156c50a in _thread_sys___syscall () at {standard input}:5
  #1  0x000017e3c15e5d7a in *_libc_mmap (addr=Variable "addr" is not available.) at /usr/src/lib/libc/sys/mmap.c:47
  #2  0x000017e17d9abc8b in alloc_code_gen_buffer () at /usr/src/qemu/accel/tcg/translate-all.c:1064
  #3  0x000017e17d9abd04 in code_gen_alloc (tb_size=0) at /usr/src/qemu/accel/tcg/translate-all.c:1112
  #4  0x000017e17d9abe81 in tcg_exec_init (tb_size=0) at /usr/src/qemu/accel/tcg/translate-all.c:1149
  #5  0x000017e17d9897e9 in tcg_init (ms=0x17e45e456800) at /usr/src/qemu/accel/tcg/tcg-all.c:66
  #6  0x000017e17d9891b8 in accel_init_machine (acc=0x17e3c3f50800, ms=0x17e45e456800) at /usr/src/qemu/accel/accel.c:63
  #7  0x000017e17d989312 in configure_accelerator (ms=0x17e45e456800, progname=0x7f7fffff07b0 "lm32-softmmu/qemu-system-lm32") at /usr/src/qemu/accel/accel.c:111
  #8  0x000017e17d9d8616 in main (argc=1, argv=0x7f7fffff06b8, envp=0x7f7fffff06c8) at vl.c:4325

[1] https://www.openbsd.org/faq/upgrade60.html
[2] https://undeadly.org/cgi?action=article&sid=20160527203200

Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
 configure | 11 +++++++++++
 1 file changed, 11 insertions(+)

Comments

Philippe Mathieu-Daudé Jan. 29, 2019, 6:02 p.m. UTC | #1
On 1/29/19 6:53 PM, Philippe Mathieu-Daudé wrote:
> Since OpenBSD 6.0 [1], W^X is enforced by default [2].
> TCG requires WX access. Disable W^X if it is available.
> This fixes:
> 
>   # lm32-softmmu/qemu-system-lm32
>   Could not allocate dynamic translator buffer
> 
>   # sysctl kern.wxabort=1
>   kern.wxabort: 0 -> 1
>   # lm32-softmmu/qemu-system-lm32
>   mmap: Not supported
>   Abort trap (core dumped)
>   # gdb -q lm32-softmmu/qemu-system-lm32 qemu-system-lm32.core
>   (gdb) bt
>   #0  0x000017e3c156c50a in _thread_sys___syscall () at {standard input}:5
>   #1  0x000017e3c15e5d7a in *_libc_mmap (addr=Variable "addr" is not available.) at /usr/src/lib/libc/sys/mmap.c:47
>   #2  0x000017e17d9abc8b in alloc_code_gen_buffer () at /usr/src/qemu/accel/tcg/translate-all.c:1064
>   #3  0x000017e17d9abd04 in code_gen_alloc (tb_size=0) at /usr/src/qemu/accel/tcg/translate-all.c:1112
>   #4  0x000017e17d9abe81 in tcg_exec_init (tb_size=0) at /usr/src/qemu/accel/tcg/translate-all.c:1149
>   #5  0x000017e17d9897e9 in tcg_init (ms=0x17e45e456800) at /usr/src/qemu/accel/tcg/tcg-all.c:66
>   #6  0x000017e17d9891b8 in accel_init_machine (acc=0x17e3c3f50800, ms=0x17e45e456800) at /usr/src/qemu/accel/accel.c:63
>   #7  0x000017e17d989312 in configure_accelerator (ms=0x17e45e456800, progname=0x7f7fffff07b0 "lm32-softmmu/qemu-system-lm32") at /usr/src/qemu/accel/accel.c:111
>   #8  0x000017e17d9d8616 in main (argc=1, argv=0x7f7fffff06b8, envp=0x7f7fffff06c8) at vl.c:4325
> 
> [1] https://www.openbsd.org/faq/upgrade60.html
> [2] https://undeadly.org/cgi?action=article&sid=20160527203200
> 
> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> ---
>  configure | 11 +++++++++++
>  1 file changed, 11 insertions(+)
> 
> diff --git a/configure b/configure
> index b18281c61f..799ec2013b 100755
> --- a/configure
> +++ b/configure
> @@ -5795,6 +5795,17 @@ if test "$mingw32" = "yes" ; then
>      done
>  fi
>  
> +# Disable OpenBSD W^X if available
> +if test "$tcg" = "yes" -a "$targetos" = "OpenBSD"; then
> +    cat > $TMPC <<EOF
> +    int main(void) { return 0; }
> +EOF
> +    wx_ldflags="-Wl,-z,wxneeded"

I told Thomas I'd remove the wx_ldflags but forgot.
Anyway this doesn't change the patch correctness.

> +    if compile_prog "" "$wx_ldflags"; then
> +        QEMU_LDFLAGS="$QEMU_LDFLAGS $wx_ldflags"
> +    fi
> +fi
> +
>  qemu_confdir=$sysconfdir$confsuffix
>  qemu_moddir=$libdir$confsuffix
>  qemu_datadir=$datadir$confsuffix
>
Eric Blake Jan. 29, 2019, 9:54 p.m. UTC | #2
On 1/29/19 11:53 AM, Philippe Mathieu-Daudé wrote:
> Since OpenBSD 6.0 [1], W^X is enforced by default [2].
> TCG requires WX access. Disable W^X if it is available.
> This fixes:
> 

>  configure | 11 +++++++++++
>  1 file changed, 11 insertions(+)
> 
> diff --git a/configure b/configure
> index b18281c61f..799ec2013b 100755
> --- a/configure
> +++ b/configure
> @@ -5795,6 +5795,17 @@ if test "$mingw32" = "yes" ; then
>      done
>  fi
>  
> +# Disable OpenBSD W^X if available
> +if test "$tcg" = "yes" -a "$targetos" = "OpenBSD"; then

test ... -a ...

is not portable (POSIX permits non-XSI systems to omit support for these
operators, but even where they are supported, there are some inherently
ambiguous inputs where you CANNOT predict whether the shell will parse
-a as a binary operator or as an argument to some other operator).
Instead, you should ALWAYS break dual tests into:

test ... && test ...

instead.  (Same for '-o' vs '|| test')
Thomas Huth Jan. 30, 2019, 7:17 a.m. UTC | #3
On 2019-01-29 22:54, Eric Blake wrote:
> On 1/29/19 11:53 AM, Philippe Mathieu-Daudé wrote:
>> Since OpenBSD 6.0 [1], W^X is enforced by default [2].
>> TCG requires WX access. Disable W^X if it is available.
>> This fixes:
>>
> 
>>  configure | 11 +++++++++++
>>  1 file changed, 11 insertions(+)
>>
>> diff --git a/configure b/configure
>> index b18281c61f..799ec2013b 100755
>> --- a/configure
>> +++ b/configure
>> @@ -5795,6 +5795,17 @@ if test "$mingw32" = "yes" ; then
>>      done
>>  fi
>>  
>> +# Disable OpenBSD W^X if available
>> +if test "$tcg" = "yes" -a "$targetos" = "OpenBSD"; then
> 
> test ... -a ...
> 
> is not portable (POSIX permits non-XSI systems to omit support for these
> operators, but even where they are supported, there are some inherently
> ambiguous inputs where you CANNOT predict whether the shell will parse
> -a as a binary operator or as an argument to some other operator).
> Instead, you should ALWAYS break dual tests into:
> 
> test ... && test ...
> 
> instead.  (Same for '-o' vs '|| test')

$ grep 'test.* -a ' configure | wc -l
21
$ grep 'test.* && ' configure | wc -l
16

Looks like we do not really care?

 Thomas
Eric Blake Feb. 5, 2019, 3:04 a.m. UTC | #4
On 1/30/19 1:17 AM, Thomas Huth wrote:

>> test ... -a ...
>>
>> is not portable (POSIX permits non-XSI systems to omit support for these
>> operators, but even where they are supported, there are some inherently
>> ambiguous inputs where you CANNOT predict whether the shell will parse
>> -a as a binary operator or as an argument to some other operator).
>> Instead, you should ALWAYS break dual tests into:
>>
>> test ... && test ...
>>
>> instead.  (Same for '-o' vs '|| test')
> 
> $ grep 'test.* -a ' configure | wc -l
> 21
> $ grep 'test.* && ' configure | wc -l
> 16
> 
> Looks like we do not really care?

Well, I care. Enough to propose a patch :)

https://lists.gnu.org/archive/html/qemu-devel/2019-02/msg00960.html
diff mbox series

Patch

diff --git a/configure b/configure
index b18281c61f..799ec2013b 100755
--- a/configure
+++ b/configure
@@ -5795,6 +5795,17 @@  if test "$mingw32" = "yes" ; then
     done
 fi
 
+# Disable OpenBSD W^X if available
+if test "$tcg" = "yes" -a "$targetos" = "OpenBSD"; then
+    cat > $TMPC <<EOF
+    int main(void) { return 0; }
+EOF
+    wx_ldflags="-Wl,-z,wxneeded"
+    if compile_prog "" "$wx_ldflags"; then
+        QEMU_LDFLAGS="$QEMU_LDFLAGS $wx_ldflags"
+    fi
+fi
+
 qemu_confdir=$sysconfdir$confsuffix
 qemu_moddir=$libdir$confsuffix
 qemu_datadir=$datadir$confsuffix