Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Find a reliable methd of resolving the glibc version #61

Open
azubieta opened this issue May 12, 2022 · 9 comments
Open

Find a reliable methd of resolving the glibc version #61

azubieta opened this issue May 12, 2022 · 9 comments

Comments

@azubieta
Copy link
Contributor

Currently we use gnu_get_libc_version to find the glibc version. This method requires a dynamically linked AppRun to work properly and this is a impediment when the target system doesn't have glibc (like in an alpine based system).

A different method is required that allows static linking of the main binary.

reference: https://stackoverflow.com/questions/71070969/how-to-extract-and-compare-the-libc-versions-at-runtime

@azubieta
Copy link
Contributor Author

Proposed solution:

  • Store version definitions for embed libraries at build time.
  • Compare definitions with the ones on the host system libraries, use the system one if all definitions are found.

Reference

@probonopd
Copy link

probonopd commented May 20, 2022

A bit hackish, but searching with strings <file> | grep GLIBC_ | sort | uniq usually gives an indication. It's what I always do when I have to find out the required glibc version manually.

@azubieta
Copy link
Contributor Author

We used that method in AppRun v1 but it failed when new symbols get added like between glibc 2.30 and 2.32.

@probonopd
Copy link

How can that be? Did they add symbols without increasing the GLIBC_ number?

@azubieta
Copy link
Contributor Author

azubieta commented May 23, 2022

They added other symbols that are not versioned with the GLIBC_ prefix.

@probonopd
Copy link

Ouch. Just as an idea, if we have two libs with the same highest GLIBC_ number, could we count the number of symbols in both and assume the one with more symbols is the newer one? A bit hackish but might get the job done?

@azubieta
Copy link
Contributor Author

I have been comparing symbols from different libraries but they add and remove symbols as they will. Those removed are private symbols that "should" not be linked but they may end linked if the developer requires it so it's a big mess there.

As there is no solution in which we could rely at 100 I decided to different detection methods like guessing the version from the file name or reading it from the embed strings. This will live in a separated executable that performs the checks and report back to the AppRun. So the AppRun can stay static. Also will add some environment variables to manually control which configuration should be used.

@probonopd
Copy link

Maybe the topic should be discussed with the glibc devs?

@azubieta
Copy link
Contributor Author

Maybe the topic should be discussed with the glibc devs?

I did it already, their answer is was precisely to use gnu_get_libc_version. Other ways are just guessing. For libstc++ the problems is more complicated as they don't provide a function retrieving the version.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants