On Wed, Oct 2, 2013 at 8:13 AM, Khem Raj <raj.k...@gmail.com> wrote:
>
> On Oct 1, 2013, at 11:03 AM, Hans Beckerus <hans.becke...@gmail.com> wrote:
>
>> On 2013-10-01 7:35, Khem Raj wrote:
>>> On Oct 1, 2013, at 6:16 AM, Hans Beckérus <hans.becke...@gmail.com> wrote:
>>>
>>>> Hello. We have stumbled into a problem when using ld directly instead
>>>> of going through the gcc frontend.
>>>> A simple operation like this fails:
>>>>
>>>>> ${CC} -c hello_world.c
>>>>> ${LD} hello_world.o -lgcc
>>>> arm-poky-linux-gnueabi-ld: cannot find -lgcc
>>>>
>>>> And yes, I know -lgcc is not required in this case to compile this
>>>> one, but this is only a simple reproducer.
>>>> The real issue was discovered when trying to build U-Boot from the SDK.
>>>>
>>>> To resolve this problem we are forced to provide
>>>> -L<sysroot>/usr/lib/arm-poky-linux-gnueabi/4.7.2 to LDFLAGS.
>>>> But that should not be needed, should it? Anyone else bumped into this
>>>> problem? Are there any "real" solutions.
>>>> I am starting to think it has to do with the hardcoded installation
>>>> path in the binaries maybe?
>>> I doubt that infact we try hard to keep it relocatable. The problem is you 
>>> are interpreting
>>> --sysroot option to do more than what its supposed to do. when linking it 
>>> only affects INPUT,  GROUP
>>> and SEARCH_DIR linker script variables and if you look at the linker script 
>>> path to libgcc is not
>>> specified in SEARCH_DIR, thats where gcc driver comes handy in figuring out 
>>> where the right libgcc is installed
>>> and sometimes when you have complex multilib environments thats very handy. 
>>> linker does not know
>>> anything about libgcc its just another library for it.
>> Hi Khem, thanks for your time. I am sure I put too much value into 
>> --sysroot, but what still strikes me a bit odd is why the simple reproducer 
>> I showed before works just fine using the local host gcc and ld? It seems to 
>> have no issues in finding libgcc.a?
>
> Does it ? what distro are you using on build host. gcc -c hello.c;ld hello.o 
> -lgcc , does that work ?
No, it does not. Whatever I tried before must have been wrong ;)

> on my Ubuntu based system it fails exact same way as OE SDK, and for the 
> reasons I described
> if you use bare ld to do linking then you can not assume it to resolve all 
> kind of environment for you
> gcc driver is there for a reason.
>
>> So what you are saying is that it is actually expected that U-Boot build 
>> will fail when compiled through the SDK toolchain directly without adding 
>> additional options to the linker? Is that also what the u-boot recipe is 
>> doing? After all, it works fine to bitbake u-boot.
>
> No, the magic is in u-boot itself see in top level Makefile
>
>
> PLATFORM_LIBGCC := -L $(shell dirname `$(CC) $(CFLAGS) 
> -print-libgcc-file-name`) -lgcc
>
Ok, but here is were it fails! The above call gets resolved to "-L .",
and we do not have USE_PRIVATE_LIBGCC defined.
Doing ${CC} -print-libgcc-file-name shows the proper value. The reason
for this I now realize is that U-Boot does not pickup $CC from our
environment (which is including the --sysroot option). Without this
option -print-libgcc-file-name resolve to a simple file name without a
path. And thus dirname resolve it further to "." :(

So the fix for us is to do:
>make LDFLAGS="" CC="$CC"

Now it works.
I assume that is also what the U-Boot recipe is doing.

Thanks.
Hans


>
>
>>
>>> however you could do  something like
>>>
>>> ${CC} -print-libgcc-file-name or ${CC} -print-file-name=libgcc.a
>>>
>>> to get to the library
>>>
>>> and specify that in your linker cmdline
>> Ok, guess it will simply give me the same path as we are currently 
>> hardcoding, but if the toolchain moves your solution is definitely to prefer.
>> Thanks for the tip. Did only not know about the --print-sysroot command 
>> until now.
>>> -Khem
>>
>
_______________________________________________
yocto mailing list
yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/yocto

Reply via email to