diff mbox

[libstdc++] Fix detection of posix_memalig for cross-builds

Message ID AM4PR0701MB2162A9E9F378D3BF2D9BE6E6E48C0@AM4PR0701MB2162.eurprd07.prod.outlook.com
State New
Headers show

Commit Message

Bernd Edlinger Nov. 30, 2016, 7 p.m. UTC
Hi,

I noticed that a cross-compiler produces an unusable libstdc++.so
that contains an unresolved reference to aligned_alloc instead of
posix_memalign, or whatever is actually available.

Therefore it is impossible to link any C++ programs against the
libstdc++.so that comes with the cross-compiler.

That happens for instance in the following configuration:
--target=arm-linux-gnueabihf.

The attached patch adds a link test for the memalign function
and fixes the cross-build for me.

Is it OK for trunk?


Thanks
Bernd.

Comments

Jonathan Wakely Nov. 30, 2016, 8:05 p.m. UTC | #1
On 30/11/16 19:00 +0000, Bernd Edlinger wrote:
>Hi,
>
>I noticed that a cross-compiler produces an unusable libstdc++.so
>that contains an unresolved reference to aligned_alloc instead of
>posix_memalign, or whatever is actually available.
>
>Therefore it is impossible to link any C++ programs against the
>libstdc++.so that comes with the cross-compiler.
>
>That happens for instance in the following configuration:
>--target=arm-linux-gnueabihf.
>
>The attached patch adds a link test for the memalign function
>and fixes the cross-build for me.
>
>Is it OK for trunk?

OK.

Presumably we should have this for other cross targets too.
Christophe Lyon Nov. 30, 2016, 9:32 p.m. UTC | #2
On 30 November 2016 at 20:00, Bernd Edlinger <bernd.edlinger@hotmail.de> wrote:
> Hi,
>
> I noticed that a cross-compiler produces an unusable libstdc++.so
> that contains an unresolved reference to aligned_alloc instead of
> posix_memalign, or whatever is actually available.
>
> Therefore it is impossible to link any C++ programs against the
> libstdc++.so that comes with the cross-compiler.
>
> That happens for instance in the following configuration:
> --target=arm-linux-gnueabihf.
>

How could this be unnoticed so far?

> The attached patch adds a link test for the memalign function
> and fixes the cross-build for me.
>
> Is it OK for trunk?
>
>
> Thanks
> Bernd.
Jonathan Wakely Nov. 30, 2016, 9:51 p.m. UTC | #3
On 30/11/16 22:32 +0100, Christophe Lyon wrote:
>On 30 November 2016 at 20:00, Bernd Edlinger <bernd.edlinger@hotmail.de> wrote:
>> Hi,
>>
>> I noticed that a cross-compiler produces an unusable libstdc++.so
>> that contains an unresolved reference to aligned_alloc instead of
>> posix_memalign, or whatever is actually available.
>>
>> Therefore it is impossible to link any C++ programs against the
>> libstdc++.so that comes with the cross-compiler.
>>
>> That happens for instance in the following configuration:
>> --target=arm-linux-gnueabihf.
>>
>
>How could this be unnoticed so far?

I did wonder that.

The newlib config is hardcoded, which probably covers a lot of the
cross builds in regular use.

>> The attached patch adds a link test for the memalign function
>> and fixes the cross-build for me.
>>
>> Is it OK for trunk?
>>
>>
>> Thanks
>> Bernd.
Christophe Lyon Nov. 30, 2016, 10:06 p.m. UTC | #4
On 30 November 2016 at 22:51, Jonathan Wakely <jwakely@redhat.com> wrote:
> On 30/11/16 22:32 +0100, Christophe Lyon wrote:
>>
>> On 30 November 2016 at 20:00, Bernd Edlinger <bernd.edlinger@hotmail.de>
>> wrote:
>>>
>>> Hi,
>>>
>>> I noticed that a cross-compiler produces an unusable libstdc++.so
>>> that contains an unresolved reference to aligned_alloc instead of
>>> posix_memalign, or whatever is actually available.
>>>
>>> Therefore it is impossible to link any C++ programs against the
>>> libstdc++.so that comes with the cross-compiler.
>>>
>>> That happens for instance in the following configuration:
>>> --target=arm-linux-gnueabihf.
>>>
>>
>> How could this be unnoticed so far?
>
>
> I did wonder that.
>
> The newlib config is hardcoded, which probably covers a lot of the
> cross builds in regular use.
>
The config mentioned by Bernd (arm-linux-gnueabihf) does not use newlib.
I checked my libstdc++.log files, there's no -static option in use, I don't
use --disable-shared, so I'm not sure why there's a problem?


>
>>> The attached patch adds a link test for the memalign function
>>> and fixes the cross-build for me.
>>>
>>> Is it OK for trunk?
>>>
>>>
>>> Thanks
>>> Bernd.
Jonathan Wakely Nov. 30, 2016, 11:10 p.m. UTC | #5
On 30/11/16 23:06 +0100, Christophe Lyon wrote:
>On 30 November 2016 at 22:51, Jonathan Wakely <jwakely@redhat.com> wrote:
>> On 30/11/16 22:32 +0100, Christophe Lyon wrote:
>>>
>>> On 30 November 2016 at 20:00, Bernd Edlinger <bernd.edlinger@hotmail.de>
>>> wrote:
>>>>
>>>> Hi,
>>>>
>>>> I noticed that a cross-compiler produces an unusable libstdc++.so
>>>> that contains an unresolved reference to aligned_alloc instead of
>>>> posix_memalign, or whatever is actually available.
>>>>
>>>> Therefore it is impossible to link any C++ programs against the
>>>> libstdc++.so that comes with the cross-compiler.
>>>>
>>>> That happens for instance in the following configuration:
>>>> --target=arm-linux-gnueabihf.
>>>>
>>>
>>> How could this be unnoticed so far?
>>
>>
>> I did wonder that.
>>
>> The newlib config is hardcoded, which probably covers a lot of the
>> cross builds in regular use.
>>
>The config mentioned by Bernd (arm-linux-gnueabihf) does not use newlib.
>I checked my libstdc++.log files, there's no -static option in use, I don't
>use --disable-shared, so I'm not sure why there's a problem?

Then you probably have a newer glibc that defines aligned_alloc, and
Bernd is using an older one that doesn't define it. Bernd?
Bernd Edlinger Dec. 1, 2016, 12:18 a.m. UTC | #6
On 12/01/16 00:10, Jonathan Wakely wrote:
> On 30/11/16 23:06 +0100, Christophe Lyon wrote:
>> On 30 November 2016 at 22:51, Jonathan Wakely <jwakely@redhat.com> wrote:
>>> On 30/11/16 22:32 +0100, Christophe Lyon wrote:
>>>>
>>>> On 30 November 2016 at 20:00, Bernd Edlinger
>>>> <bernd.edlinger@hotmail.de>
>>>> wrote:
>>>>>
>>>>> Hi,
>>>>>
>>>>> I noticed that a cross-compiler produces an unusable libstdc++.so
>>>>> that contains an unresolved reference to aligned_alloc instead of
>>>>> posix_memalign, or whatever is actually available.
>>>>>
>>>>> Therefore it is impossible to link any C++ programs against the
>>>>> libstdc++.so that comes with the cross-compiler.
>>>>>
>>>>> That happens for instance in the following configuration:
>>>>> --target=arm-linux-gnueabihf.
>>>>>
>>>>
>>>> How could this be unnoticed so far?
>>>
>>>
>>> I did wonder that.
>>>
>>> The newlib config is hardcoded, which probably covers a lot of the
>>> cross builds in regular use.
>>>
>> The config mentioned by Bernd (arm-linux-gnueabihf) does not use newlib.
>> I checked my libstdc++.log files, there's no -static option in use, I
>> don't
>> use --disable-shared, so I'm not sure why there's a problem?
>
> Then you probably have a newer glibc that defines aligned_alloc, and
> Bernd is using an older one that doesn't define it. Bernd?
>

Yes.

It is from 2011, glibc-2.15 as it looks like.

I never had any issues with that, because it is supposed to be upward
compatible with newer glibc, I did update the glibc on the target
system recently to glibc-2.23, though, and had not noticed any issues,
before.


Thanks
Bernd.
Christophe Lyon Dec. 1, 2016, 7:50 a.m. UTC | #7
On 1 December 2016 at 01:18, Bernd Edlinger <bernd.edlinger@hotmail.de> wrote:
> On 12/01/16 00:10, Jonathan Wakely wrote:
>> On 30/11/16 23:06 +0100, Christophe Lyon wrote:
>>> On 30 November 2016 at 22:51, Jonathan Wakely <jwakely@redhat.com> wrote:
>>>> On 30/11/16 22:32 +0100, Christophe Lyon wrote:
>>>>>
>>>>> On 30 November 2016 at 20:00, Bernd Edlinger
>>>>> <bernd.edlinger@hotmail.de>
>>>>> wrote:
>>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> I noticed that a cross-compiler produces an unusable libstdc++.so
>>>>>> that contains an unresolved reference to aligned_alloc instead of
>>>>>> posix_memalign, or whatever is actually available.
>>>>>>
>>>>>> Therefore it is impossible to link any C++ programs against the
>>>>>> libstdc++.so that comes with the cross-compiler.
>>>>>>
>>>>>> That happens for instance in the following configuration:
>>>>>> --target=arm-linux-gnueabihf.
>>>>>>
>>>>>
>>>>> How could this be unnoticed so far?
>>>>
>>>>
>>>> I did wonder that.
>>>>
>>>> The newlib config is hardcoded, which probably covers a lot of the
>>>> cross builds in regular use.
>>>>
>>> The config mentioned by Bernd (arm-linux-gnueabihf) does not use newlib.
>>> I checked my libstdc++.log files, there's no -static option in use, I
>>> don't
>>> use --disable-shared, so I'm not sure why there's a problem?
>>
>> Then you probably have a newer glibc that defines aligned_alloc, and
>> Bernd is using an older one that doesn't define it. Bernd?
>>
>
> Yes.
>
> It is from 2011, glibc-2.15 as it looks like.
>
> I never had any issues with that, because it is supposed to be upward
> compatible with newer glibc, I did update the glibc on the target
> system recently to glibc-2.23, though, and had not noticed any issues,
> before.
>

OK, it makes sense: I'm using glibc-2.20.

>
> Thanks
> Bernd.
diff mbox

Patch

2016-11-30  Bernd Edlinger  <bernd.edlinger@hotmail.de>

	* crossconfig.m4 (*-linux*): Add link-check for memalign.
	* configure: Regenerated.

Index: libstdc++-v3/configure
===================================================================
--- libstdc++-v3/configure	(revision 242960)
+++ libstdc++-v3/configure	(working copy)
@@ -59826,11 +59826,24 @@  _ACEOF
 fi
 done
 
+    for ac_func in aligned_alloc posix_memalign memalign _aligned_malloc
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+eval as_val=\$$as_ac_var
+   if test "x$as_val" = x""yes; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
 
+fi
+done
 
 
 
 
+
+
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
 $as_echo_n "checking for iconv... " >&6; }
 if test "${am_cv_func_iconv+set}" = set; then :
Index: libstdc++-v3/crossconfig.m4
===================================================================
--- libstdc++-v3/crossconfig.m4	(revision 242960)
+++ libstdc++-v3/crossconfig.m4	(working copy)
@@ -157,6 +157,7 @@  case "${host}" in
     AC_DEFINE(_GLIBCXX_USE_RANDOM_TR1)
     GCC_CHECK_TLS
     AC_CHECK_FUNCS(__cxa_thread_atexit_impl)
+    AC_CHECK_FUNCS(aligned_alloc posix_memalign memalign _aligned_malloc)
     AM_ICONV
     ;;
   *-mingw32*)