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

Not working on ubuntu 22.04, version `GLIBC_2.34' not found #169

Closed
r888800009 opened this issue Nov 26, 2023 · 6 comments
Closed

Not working on ubuntu 22.04, version `GLIBC_2.34' not found #169

r888800009 opened this issue Nov 26, 2023 · 6 comments

Comments

@r888800009
Copy link
Contributor

Hello, compiling PoC on ubuntu 22.04 docker image will link to the /lib/x86_64-linux-gnu/libc.so.6 and not a specific libc version
This problem only occurs when using ubuntu 22.04
ubuntu 20.04 works fine

docker run --rm -it ubuntu:22.04
apt update
apt -y install patchelf zstd python-is-python3 make git gcc
git clone https://github.com/shellphish/how2heap
cd how2heap
make clean all
./glibc_run.sh 2.31 ./malloc_playground -r
Getting 2.31-0ubuntu9.12_amd64
  -> Location: https://mirror.tuna.tsinghua.edu.cn/ubuntu/pool/main/g/glibc/libc6_2.31-0ubuntu9.12_amd64.deb
  -> Downloading libc binary package
Failed to download package from https://mirror.tuna.tsinghua.edu.cn/ubuntu/pool/main/g/glibc/libc6_2.31-0ubuntu9.12_amd64.deb
Getting 2.31-0ubuntu9.12_amd64
  -> Location: http://old-releases.ubuntu.com/ubuntu/pool/main/g/glibc/libc6_2.31-0ubuntu9.12_amd64.deb
  -> Downloading libc binary package
Failed to download package from http://old-releases.ubuntu.com/ubuntu/pool/main/g/glibc/libc6_2.31-0ubuntu9.12_amd64.deb
/work/how2heap
INERPERETER as ./glibc_versions/2.31/x64/lib/ld-2.31.so for ./malloc_playground
RPATH as ./glibc_versions/2.31/x64/lib
./malloc_playground: ./glibc_versions/2.31/x64/lib/libc.so.6: version `GLIBC_2.34' not found (required by ./malloc_playground)
@Kyle-Kyle
Copy link
Contributor

It seems that the error first comes from Failed to download package from https://mirror.tuna.tsinghua.edu.cn/ubuntu/pool/main/g/glibc/libc6_2.31-0ubuntu9.12_amd64.deb.
So, somehow it fails to download the correct libc.
I'll investigate what's going on.

@Kyle-Kyle
Copy link
Contributor

It turns out the issue is on symbol versioning.
In glibc 2.34, glibc introduced a new version of __libc_start_main (https://sourceware.org/bugzilla/show_bug.cgi?id=23323). So, every binary compiled in the environment after glibc-2.34 will try to link with __libc_start_main@GLIBC_2.34 instead of __libc_start_main@GLIBC_2.2.5. But glibc-2.31(the one you are trying to link against) is not aware of the new version, it errors out.
To solve this issue, you'd have to compile the malloc_playground in an environment before glibc-2.34 and then link it with glibc-2.31. Or link it with a libc that's higher than or equal to glibc-2.34.
Some extra reference: https://github.com/wheybags/glibc_version_header

@Kyle-Kyle
Copy link
Contributor

Since this is more of a glibc symbol versioning question, I'll not do anything about it.
Please reopen the issue if you think more should be done in this repo.

@oswalpalash
Copy link

A work around would be to share the repo as a volume mount into a ubuntu:20.04 container and then build it in the container.

@Kyle-Kyle
Copy link
Contributor

FYI, I just updated our make system today. By using some linker magic, you can now freely debug compiled binaries with every libc without the symbol versioning issue.

@Kyle-Kyle
Copy link
Contributor

Kyle-Kyle commented May 1, 2024

the relevant code can be found here: https://github.com/shellphish/how2heap/blob/master/Makefile#L59

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

3 participants