Skip to content
New issue

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

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

Already on GitHub? # 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

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

No branches or pull requests

3 participants