* [Buildroot] libstdc++ DSO missing
@ 2022-09-09 12:34 Alex
2022-09-09 15:40 ` Nicolas Cavallari
0 siblings, 1 reply; 5+ messages in thread
From: Alex @ 2022-09-09 12:34 UTC (permalink / raw)
To: buildroot, busybox
Hi,
I intergrated my application to buildroot. Complie is successfull by
when linking I get errors:
x86_64-buildroot-linux-gnu/sysroot/usr/lib64/libstdc++.so.6: error
adding symbols: DSO missing from command line
Are libraries missing from buildroot environment?
Additional I get warnings that some .so files not found, but they are
available in output/build/<Tool>/lib
But I included this path by $(@D)/../<Tool>/lib
What is missing in build command?
Any ideas what is missing or what to do to handle the DSO missing error???
Thanks!
King regards,
Alex
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Buildroot] libstdc++ DSO missing
2022-09-09 12:34 [Buildroot] libstdc++ DSO missing Alex
@ 2022-09-09 15:40 ` Nicolas Cavallari
2022-09-11 9:41 ` Alex
0 siblings, 1 reply; 5+ messages in thread
From: Nicolas Cavallari @ 2022-09-09 15:40 UTC (permalink / raw)
To: Alex, buildroot
On 09/09/2022 14:34, Alex wrote:
> Hi,
>
> I intergrated my application to buildroot. Complie is successfull by
> when linking I get errors:
>
> x86_64-buildroot-linux-gnu/sysroot/usr/lib64/libstdc++.so.6: error
> adding symbols: DSO missing from command line
This error means that:
- the linker found a library with a DT_NEEDED dependency on libstdc++.so.6
- the linker found libstdc++.so.6
- the linker is missing symbols
- the linker found the missing symbols in libstdc++.so.6
- but the linker command line does not include libstdc++.so.6
- so the linker is not sure if the user actually intended to link with
libstdc++.so.6.
- so it refuses to link.
Since libstdc++.so.6 is the C++ runtime library, this either mean that:
- you are linking a C++ program with ld or gcc instead of g++
- you are linking a C program with a C++ library that requires libstdc++.so.6,
in this case you may need -lstdc++ on the linker command line.
> Are libraries missing from buildroot environment?
No, only the linker command line is incorrect.
> Additional I get warnings that some .so files not found, but they are
> available in output/build/<Tool>/lib
The compiler will only search libraries in output/staging/lib or
output/staging/usr/lib.
The package for <Tool> should install the libraries there, so that other
programs can link with them. This is done by putting
<TOOL>_INSTALL_STAGING = YES
in its .mk file. If <Tool> is a generic-package (and not a
autotools/meson/cmake package), then you also need to manually explain how to
install libraries to $(STAGING_DIR)/lib:
https://nightly.buildroot.org/manual.html#_infrastructure_for_packages_with_specific_build_systems
> But I included this path by $(@D)/../<Tool>/lib
While it may work, this is a kludge.
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Buildroot] libstdc++ DSO missing
2022-09-09 15:40 ` Nicolas Cavallari
@ 2022-09-11 9:41 ` Alex
2022-09-16 21:08 ` Richard Ash
0 siblings, 1 reply; 5+ messages in thread
From: Alex @ 2022-09-11 9:41 UTC (permalink / raw)
To: buildroot, busybox
Thank you for your detailed explanation.
> On 09/09/2022 14:34, Alex wrote:
>> Hi,
>>
>> I intergrated my application to buildroot. Complie is successfull by
>> when linking I get errors:
>>
>> x86_64-buildroot-linux-gnu/sysroot/usr/lib64/libstdc++.so.6: error
>> adding symbols: DSO missing from command line
>
> This error means that:
> - the linker found a library with a DT_NEEDED dependency on
> libstdc++.so.6
> - the linker found libstdc++.so.6
> - the linker is missing symbols
> - the linker found the missing symbols in libstdc++.so.6
> - but the linker command line does not include libstdc++.so.6
> - so the linker is not sure if the user actually intended to link with
> libstdc++.so.6.
> - so it refuses to link.
>
> Since libstdc++.so.6 is the C++ runtime library, this either mean that:
> - you are linking a C++ program with ld or gcc instead of g++
Yap, outside of buildroot, linking calls the g++ but when linking inside
buildroot, calls the x86_64-buildroot-linux-gnu-ld,
because $(LD) in the makefile is set to x86_64-buildroot-linux-gnu-ld
within buildroot.
Inside the package .mk file of the BUILD_CMDS calls make:
$(MAKE) $(TARGET_CONFIGURE_OPTS) -C $(@D)
So (a kludge to test), i replaced in the Makefile
$(LD)
by
$(HOST_DIR)/bin/x86_64-linux-g++
Now linking is successfull...
Is there a more "elegant" way to do this...? Not so a kludge like that,
mean setting this within the mk file before calling the projekt make...
And how to specifey $(CC) also to g++??
> - you are linking a C program with a C++ library that requires
> libstdc++.so.6, in this case you may need -lstdc++ on the linker
> command line.
>
>> Are libraries missing from buildroot environment?
>
> No, only the linker command line is incorrect.
>
>> Additional I get warnings that some .so files not found, but they are
>> available in output/build/<Tool>/lib
>
> The compiler will only search libraries in output/staging/lib or
> output/staging/usr/lib.
> The package for <Tool> should install the libraries there, so that
> other programs can link with them. This is done by putting
>
> <TOOL>_INSTALL_STAGING = YES
>
> in its .mk file. If <Tool> is a generic-package (and not a
> autotools/meson/cmake package), then you also need to manually explain
> how to install libraries to $(STAGING_DIR)/lib:
Indeed I forgot one of the .so to be installed to staging. After adding
this and append to the $(MAKE) call the LD_LIBRARY_PATH="$(@D)../<Tool>/lib"
compile and linking is successfull.
>
> https://nightly.buildroot.org/manual.html#_infrastructure_for_packages_with_specific_build_systems
>
>
>> But I included this path by $(@D)/../<Tool>/lib
>
> While it may work, this is a kludge.
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Buildroot] libstdc++ DSO missing
2022-09-11 9:41 ` Alex
@ 2022-09-16 21:08 ` Richard Ash
2022-09-17 12:41 ` Edgar Bonet
0 siblings, 1 reply; 5+ messages in thread
From: Richard Ash @ 2022-09-16 21:08 UTC (permalink / raw)
To: Alex; +Cc: busybox, buildroot
On Sun, 11 Sep 2022 11:41:51 +0200
Alex <earthquake.de@freenet.de> wrote:
> Thank you for your detailed explanation.
> > On 09/09/2022 14:34, Alex wrote:
> >> Hi,
> >>
> >> I intergrated my application to buildroot. Complie is successfull
> >> by when linking I get errors:
> >>
> >> x86_64-buildroot-linux-gnu/sysroot/usr/lib64/libstdc++.so.6: error
> >> adding symbols: DSO missing from command line
> >
> > This error means that:
> > - the linker found a library with a DT_NEEDED dependency on
> > libstdc++.so.6
> > - the linker found libstdc++.so.6
> > - the linker is missing symbols
> > - the linker found the missing symbols in libstdc++.so.6
> > - but the linker command line does not include libstdc++.so.6
> > - so the linker is not sure if the user actually intended to link
> > with libstdc++.so.6.
> > - so it refuses to link.
> >
> > Since libstdc++.so.6 is the C++ runtime library, this either mean
> > that:
> > - you are linking a C++ program with ld or gcc instead of g++
>
> Yap, outside of buildroot, linking calls the g++ but when linking
> inside buildroot, calls the x86_64-buildroot-linux-gnu-ld,
> because $(LD) in the makefile is set to x86_64-buildroot-linux-gnu-ld
> within buildroot.
I don't think it's ever been normal usage to use $(LD) when trying to
link anything involving dynamic linkage. As far as I'm aware, your
Makefile shouldn't be using $(LD) if you are linking dynamically. As
you are linking a C++ application, the link command should be using
$(CXX) (make doesn't seem to have a built in rule for linking C++, but
it's what I have always used and not had this sort of problem).
$(CXX) will be pointing to the correct g++, which will then call out to
the correct ld as required, with the correct options.
If you make this change to your Makefile you shouldn't need your kludge.
Richard
> Inside the package .mk file of the BUILD_CMDS calls make:
>
> $(MAKE) $(TARGET_CONFIGURE_OPTS) -C $(@D)
>
> So (a kludge to test), i replaced in the Makefile
> $(LD)
> by
> $(HOST_DIR)/bin/x86_64-linux-g++
> Now linking is successfull...
> Is there a more "elegant" way to do this...? Not so a kludge like
> that, mean setting this within the mk file before calling the projekt
> make... And how to specifey $(CC) also to g++??
>
>
> > - you are linking a C program with a C++ library that requires
> > libstdc++.so.6, in this case you may need -lstdc++ on the linker
> > command line.
> >
> >> Are libraries missing from buildroot environment?
> >
> > No, only the linker command line is incorrect.
> >
> >> Additional I get warnings that some .so files not found, but they
> >> are available in output/build/<Tool>/lib
> >
> > The compiler will only search libraries in output/staging/lib or
> > output/staging/usr/lib.
> > The package for <Tool> should install the libraries there, so that
> > other programs can link with them. This is done by putting
> >
> > <TOOL>_INSTALL_STAGING = YES
> >
> > in its .mk file. If <Tool> is a generic-package (and not a
> > autotools/meson/cmake package), then you also need to manually
> > explain how to install libraries to $(STAGING_DIR)/lib:
>
> Indeed I forgot one of the .so to be installed to staging. After
> adding this and append to the $(MAKE) call the
> LD_LIBRARY_PATH="$(@D)../<Tool>/lib" compile and linking is
> successfull.
>
> >
> > https://nightly.buildroot.org/manual.html#_infrastructure_for_packages_with_specific_build_systems
> >
> >
> >> But I included this path by $(@D)/../<Tool>/lib
> >
> > While it may work, this is a kludge.
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Buildroot] libstdc++ DSO missing
2022-09-16 21:08 ` Richard Ash
@ 2022-09-17 12:41 ` Edgar Bonet
0 siblings, 0 replies; 5+ messages in thread
From: Edgar Bonet @ 2022-09-17 12:41 UTC (permalink / raw)
To: Richard Ash, Alex; +Cc: buildroot
Hello!
Richard Ash wrote:
> make doesn't seem to have a built in rule for linking C++
It does have this builtin rule:
%: %.cpp
$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
with these defaults:
LINK.cpp = $(LINK.cc)
LINK.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
CXX = g++
However, the builtin rule for linking object files uses $(CC) (which
defaults to cc), irrespective of whether these object files come from C
or from C++.
Regards,
Edgar.
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-09-17 12:50 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-09 12:34 [Buildroot] libstdc++ DSO missing Alex
2022-09-09 15:40 ` Nicolas Cavallari
2022-09-11 9:41 ` Alex
2022-09-16 21:08 ` Richard Ash
2022-09-17 12:41 ` Edgar Bonet
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.