riebl/vanetza

Problem when running socktap for the first time

lo-hei opened this issue · 14 comments

Hi,
i compiled Vanetza for a craton2 successfully. I copied the shared object files (*.so) from $HOME/vanetza-deps/libs onto the Craton2 to /usr/lib. The compiled socktap is in /home/user/vanetza/bin. libatlklocal_linux_u.so is in /usr/lib.
When executing ./socktap i am getting following error:

root@autotalks:~/ext-fs/usr/bin# socktap
socktap: /lib/libm.so.6: version GLIBC_2.29 not found (required by socktap)
socktap: /home/root/ext-fs/usr/lib/libstdc++.so.6: version GLIBCXX_3.4.26 not found (required by socktap)
socktap: /home/root/ext-fs/usr/lib/libstdc++.so.6: version GLIBCXX_3.4.29 not found (required by socktap)
socktap: /home/root/ext-fs/usr/lib/libstdc++.so.6: version CXXABI_1.3.13 not found (required by socktap)
socktap: /lib/libc.so.6: version GLIBC_2.32 not found (required by socktap)
socktap: /lib/libc.so.6: version GLIBC_2.34 not found (required by socktap)

@Irisbus maybe you know where my problem is? GLIB should be included in the poky-container, am i right?
Maybe i am missing something or forgot to copy onto the CRATON2.

Thanks a lot

My first guess is that you compile vanetza (socktap) against other version of Yocto than you are using on the Craton device. Since Autotalks SDK Release 18, they use Yocto 4.0.0, which uses glibc 2.35 (in contrast with previous version Yocto 3.x, that used an older glibc version AFAIK).

Sorry for that question but i just read the doc from Autotalks about Installing & Building CRATON2 SDK. From that after compiling the SDK localy on my Ubuntu PC, i just copied the libatlklocal_linux_u.so onto the EVK (CRATON2). But i guess this is not enough to have Yocto on the EVK, right? Should i run the poky installation script on the EVK (CRATON2), too?

Also, i am not sure where to put the .so files. I put them into /usr/lib, as mentioned above (not in /home/root/vanetza/lib) because otherwise i got an error while loading shared libraries: libboost_system.so.1.71.0: cannot open shared object file: No such file or directory error. In your Doc, the sentence "You should start the binary in the same directory as you would be running code from Autotalks examples (it needs their configuration files)" is a bit confusing to me.

Thanks for that quick response. I appreciate your work very much.

Well I think you did everything you needed, poky installation script is not ran on the EVK.

As for the vanetza prerequisity libraries, if you put them in the /home/root/vanetza/lib directory, you must edit LD_LIBRARY_PATH varible (as per the Autotalks documents), e.g. like this:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:'/home/root/vanetza/lib'

Can you run the example applications from the SDK (diag-cli, v2x-example,...) on the device? If those are not working correctly, I would begin with that.

the sentence "You should start the binary in the same directory as you would be running code from Autotalks examples (it needs their configuration files)" is a bit confusing

By this I mean that the socktap binary should be in the same directory where Autotalks configuration files are located (as they are fetched from the binary's current folder). This is also the directory where the SDK examples are located.

In the default state I believe that this is /usr/bin folder.

I copied socktap into /usr/bin and tried to run it there. The .so files are now in /usr/lib, but only the .so files from $HOME/vanetza-deps/libs, not all the other files from $HOME/vanetza-dist/libs. Right?

Still the same error "GLIBC_2.29/2.32/2.34 not found".
diag-cli is running fine, but when i try to run the v2x-example i got

root@autotalks:/usr/bin# v2x-example
v2x-example: error while loading shared libraries: libatlkpoti.so: cannot open shared object file: No such file or directory

I used SDK version 5.18 and the poky-container poky-craton2-glibc-x86_64-meta-toolchain-cortexa7t2hf-neon-atk42xx-evk-nand-toolchain-4.0.1
But i am not sure about the Yocto-Version on the EVK. Maybe that could be the problem? Is there a way to check wich Yocto Version is installed? And what would be the easiest way to update this?

Tanks a lot

Do you really mean SDK version 5.18? Newest I was using was 5.17.0 (Release 18), AFAIK now the newest version is 5.17.1 (Release 18.1) which I have not tried yet. Maybe you have access to some newer version than me.

As for the v2x-example error, I cannot help you with that as I have never seen libatlkpoti.so. If it was libpoti.so, I would say you forgot to copy the file to the Craton filesystem. Maybe this is some new thing in the newer SDK Release?

I would think you have the correct Yocto version as diag-cli is running fine. If you want to update the board, you would have to flash the whole filesystem using the STA Flash Loader application (but you had to do this the first time you got the board, no?). Check for version:
root@autotalks:~# cat /proc/version

I still think that cause of the original problem may be that you are linking the executable against wrong libc version (e.g. /tools/gcc/arm/poky-st/4.0.1/sysroots/cortexa7t2hf-neon-poky-linux-gnueabi/lib/libc.so.6 on your computer (if you use this directory) is other version than /lib/libc.so.6 on Craton).

On Craton:

  • Do you have correctly set LD_LIBRARY_PATH (echo $LD_LIBRARY_PATH)?
  • What do you get when you execute the file libc.so.6 on Craton (/lib/libc.so.6)?

Yeah, it is a newer release. I switched to Release 18 (SDK 5.17) but still same Problem. But thanks a lot for your help.

root@autotalks:~# cat /proc/version
Linux version 4.19.102 (oe-user@oe-host) (gcc version 8.2.0 (GCC)) #1 SMP Thu Dec 30 14:58:55 UTC 2021

root@autotalks:~# /lib/libc.so.6
GNU C Library (GNU libc) stable release version 2.28.
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 8.2.0.
libc ABIs: UNIQUE ABSOLUTE
For bug reporting instructions, please see:
http://www.gnu.org/software/libc/bugs.html.

root@autotalks:~# echo $LD_LIBRARY_PATH
/lib:/usr/lib:/home/root/ext-fs/lib:/home/root/ext-fs/usr/lib

The LD_LIBRARY_PATH seems to reset after every reboot. I added the Vanetza-Path multiple times, but after every reboot it is back to the paths printed above.
To be sure: To replace an old libatlklocal_linux_u.so i have to paste the new one in /home/root/ext-fs/system-setup/usr/lib/ and run the sync command?
Do i need a new flash of the YOCTO-Build with this lib in "<yocto root>/craton2-yocto-build/extensions/usr/lib? I have to say that i received the device with pre-flashed YOCTO and LINUX from Autotalks, so i did not had to flash anything on it.

See my first response.

My first guess is that you compile vanetza (socktap) against other version of Yocto than you are using on the Craton device. Since Autotalks SDK Release 18, they use Yocto 4.0.0, which uses glibc 2.35 (in contrast with previous version Yocto 3.x, that used an older glibc version AFAIK).

You have an old Yocto version installed. From the Linux kernel version 4.19.102 and glibc 2.28, you can see that on Craton you are indeed not using Yocto 4.0.0 and missing glibc 2.35 which you are linking your app to.

I switched to Release 18 (SDK 5.17) but still same Problem.

As Release 18 already uses Yocto 4.0.0, I believe you would have to switch to Release 17 in order to work without reflashing Craton.

The LD_LIBRARY_PATH seems to reset after every reboot.

That's normal

Do i need a new flash of the YOCTO-Build

You will have to either link to correct version of Poky toolchain (e.g. switch to the older SDK) or flash the whole system on Craton, yes.
Honestly, I am surprised how diag-cli was even running for you.

Okay thanks for your help.
Then i will try to flash a new YOCTO Verison on my EVK.
Hopefully that will solve the Problem. One last question. Where do i find the EVK Configuration file, which i should select in the STA Flasher? Sorry, i don't get it...

Where do i find the EVK Configuration file

If you are building Yocto manually, it will be copied to the output directory according to your selected hardware configuration.
If you are using Autotalks pre-built image, it is right there in the folder with binaries. I got the software through another supplier than Autotalks so it may be a little bit different (we were using Murata evaluation board).

This is my last response about flashing the EVK. It is not relevant for Vanetza in any way and this is not Autotalks support forum.

I'm sorry, you're absolutely right. I would like to apologize for my last question. After a few days of work I installed the new Yocto version on the EVK and the socketap application starts up. Unfortunately, when selecting the Autotalks-Link-Layer i receive the error

./socktap: symbol lookup error: ./socktap: undifined symbol: atlk_err_mg_init

I would think that is due to the initialization in the socktap example, which i had to copy from the main() function of the "basic SDK example". Maybe I did something wrong here. I am not sure what i have to copy from v2x-example.c. If i copy the variables and the "Reference system initialization" it seems not to be enough.

Could you please delete the initialization code from your comment? I did not put it to the example in purpose, it may not be a real problem but I believe it is Autotalks proprietary code, so I fear sharing it online...

Anyway, when you remove the initialization code, does the issue disappear? Also, which SDK version did you end up using, version 5.18? Try to run socktap from the same directory where you would run v2x-example. If this does not help, I think that the issue may come from the fact that in the newer SDK version, there are some other object files or libraries that the project must be linked against in order to run correctly (I do not know however, why the compilation doesn't fail with some linker error?). I know that when migrating to Release 18, I encountered similar issues of missing some symbols.
Unfortunately, because as I already said, we for some reason do not have access to the SDK 5.18, I cannot give you a detailed solution. As I think that this must be some needed dynamic library or missing object file, I would do the following:

When you are building the SDK examples using make command, instead of make, do make dry run -- make -n. E.g. instead of

make -C output.cr2_lnx/armv7-32/examples/common/communications/

do

make -C output.cr2_lnx/armv7-32/examples/common/communications/ -n

Look at the output and find for example linking step of v2x-example (after line echo [LD.armv7-32] v2x-example). Look at the .o files that are linked together. Are there any other files than the ones that are set to variable AUTOTALKS_OBJECTS in cmake/FindAutotalks.cmake? Try to add them there and recompile the project. Are there linked any .so or .a (using -l or -L) files except those added using add_library()? Try to add them there and recompile the project (NB that -L and -l crops away lib and .a/.so from the files - e.g. libtommath.a becomes tommath - you probably know that but just to be sure).

If this does not help, I would try to search for atlk_err_mg_init (if it is like that, sometimes you are missing some letters) in the library code to try to locate that symbol. In the SDK directory, do something like grep -rn . -e "atlk_err_mg_init", this may help you find the right module and help further debugging.

Last way would be to use some tool like nm on the dynamic libraries or ar on static libraries (poky variants of course), to find where the symbol is really located.

I would like to conclude this issue by thanking you for your fantastic help and briefly summarizing the points at which it failed for me. Maybe someone will have similar problems in the future.

  • To get SOCKTAP running on a CRATON2 you need to have the correct Yocto image installed with a compatible version. This can be found in the release notes and can be read on the system with root@autotalks:~# cat /proc/version (at this point I needed a newer version, which i flashed to the EVK by using Autotalks Instruction and the STA flasher).
  • The error with the missing atlk_err_mg_init symbol resulted from the fact that a compatible SDK version was used (downloaded and executed), but the symlink in $HOME still pointed to another SDK version. For the upcoming release 19 this bug will have to be fixed (unfortunately I couldn't find out in the short time which library has to be added and contains this symbol). Release 18 worked without problems.
  • Last but not least the solution in case of an error while loading shared libraries" : Just save these libraries under home/root/vanetza/lib and set LD_LIBRARY_PATH=$LD_LIBRARY_PATH:'/home/root/vanetza/lib'. Socktap must be stored and executed in /usr/bin (cd /usr/bin and then ./socktap). For an EVK with external filesystem (ext-fs) the file must be placed in /home/root/ext-fs/system-setup/usr/bin. Afterwards the command sync must be executed and after a reboot the SOCKTAP application is located in /usr/bin and ready to use.

For many the steps will be self-evident, but if someone is new to working with the Autotalks EVKs (like me) this information might be useful.
Thanks again @Irisbus for the help.

You're welcome, glad you solved your issues!