diff mbox

avx2 configure: Disable if static build

Message ID 1468525094-11959-1-git-send-email-alindsay@codeaurora.org
State New
Headers show

Commit Message

Aaron Lindsay July 14, 2016, 7:38 p.m. UTC
This avoids a segfault like the following for at least some 4.8 versions
of gcc when configured with --static if avx2 instructions are also
enabled:

	Program received signal SIGSEGV, Segmentation fault.
	buffer_find_nonzero_offset_ifunc () at ./util/cutils.c:333
	333     {
	(gdb) bt
	#0  buffer_find_nonzero_offset_ifunc () at ./util/cutils.c:333
	#1  0x0000000000939c58 in __libc_start_main ()
	#2  0x0000000000419337 in _start ()

Signed-off-by: Aaron Lindsay <alindsay@codeaurora.org>
---
 configure | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

Comments

Dr. David Alan Gilbert July 19, 2016, 7:12 p.m. UTC | #1
* Aaron Lindsay (alindsay@codeaurora.org) wrote:
> This avoids a segfault like the following for at least some 4.8 versions
> of gcc when configured with --static if avx2 instructions are also
> enabled:
> 
> 	Program received signal SIGSEGV, Segmentation fault.
> 	buffer_find_nonzero_offset_ifunc () at ./util/cutils.c:333
> 	333     {
> 	(gdb) bt
> 	#0  buffer_find_nonzero_offset_ifunc () at ./util/cutils.c:333
> 	#1  0x0000000000939c58 in __libc_start_main ()
> 	#2  0x0000000000419337 in _start ()
> 
> Signed-off-by: Aaron Lindsay <alindsay@codeaurora.org>

It does look like the simplest solution to the problem;

Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>

Dave

> ---
>  configure | 17 ++++++++++-------
>  1 file changed, 10 insertions(+), 7 deletions(-)
> 
> diff --git a/configure b/configure
> index 5ada56d..169aa88 100755
> --- a/configure
> +++ b/configure
> @@ -1788,7 +1788,9 @@ fi
>  ##########################################
>  # avx2 optimization requirement check
>  
> -cat > $TMPC << EOF
> +
> +if test "$static" = "no" ; then
> +  cat > $TMPC << EOF
>  #pragma GCC push_options
>  #pragma GCC target("avx2")
>  #include <cpuid.h>
> @@ -1801,12 +1803,13 @@ static void *bar_ifunc(void) {return (void*) bar;}
>  int foo(void *a) __attribute__((ifunc("bar_ifunc")));
>  int main(int argc, char *argv[]) { return foo(argv[0]);}
>  EOF
> -if compile_object "" ; then
> -    if has readelf; then
> -        if readelf --syms $TMPO 2>/dev/null |grep -q "IFUNC.*foo"; then
> -            avx2_opt="yes"
> -        fi
> -    fi
> +  if compile_object "" ; then
> +      if has readelf; then
> +          if readelf --syms $TMPO 2>/dev/null |grep -q "IFUNC.*foo"; then
> +              avx2_opt="yes"
> +          fi
> +      fi
> +  fi
>  fi
>  
>  #########################################
> -- 
> Qualcomm Datacenter Technologies as an affiliate of Qualcomm Technologies, Inc.
> Qualcomm Technologies, Inc. is a member of the
> Code Aurora Forum, a Linux Foundation Collaborative Project.
> 
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
Peter Maydell July 29, 2016, 2:22 p.m. UTC | #2
On 19 July 2016 at 20:12, Dr. David Alan Gilbert <dgilbert@redhat.com> wrote:
> * Aaron Lindsay (alindsay@codeaurora.org) wrote:
>> This avoids a segfault like the following for at least some 4.8 versions
>> of gcc when configured with --static if avx2 instructions are also
>> enabled:
>>
>>       Program received signal SIGSEGV, Segmentation fault.
>>       buffer_find_nonzero_offset_ifunc () at ./util/cutils.c:333
>>       333     {
>>       (gdb) bt
>>       #0  buffer_find_nonzero_offset_ifunc () at ./util/cutils.c:333
>>       #1  0x0000000000939c58 in __libc_start_main ()
>>       #2  0x0000000000419337 in _start ()
>>
>> Signed-off-by: Aaron Lindsay <alindsay@codeaurora.org>
>
> It does look like the simplest solution to the problem;
>
> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>

Applied to master, thanks.

-- PMM
diff mbox

Patch

diff --git a/configure b/configure
index 5ada56d..169aa88 100755
--- a/configure
+++ b/configure
@@ -1788,7 +1788,9 @@  fi
 ##########################################
 # avx2 optimization requirement check
 
-cat > $TMPC << EOF
+
+if test "$static" = "no" ; then
+  cat > $TMPC << EOF
 #pragma GCC push_options
 #pragma GCC target("avx2")
 #include <cpuid.h>
@@ -1801,12 +1803,13 @@  static void *bar_ifunc(void) {return (void*) bar;}
 int foo(void *a) __attribute__((ifunc("bar_ifunc")));
 int main(int argc, char *argv[]) { return foo(argv[0]);}
 EOF
-if compile_object "" ; then
-    if has readelf; then
-        if readelf --syms $TMPO 2>/dev/null |grep -q "IFUNC.*foo"; then
-            avx2_opt="yes"
-        fi
-    fi
+  if compile_object "" ; then
+      if has readelf; then
+          if readelf --syms $TMPO 2>/dev/null |grep -q "IFUNC.*foo"; then
+              avx2_opt="yes"
+          fi
+      fi
+  fi
 fi
 
 #########################################