LINUX.ORG.RU

Статический бинарник для программы на OpenGL (Raylib)

 , , raylib


0

2

Программа на Си, сама библиотека raylib статически собирается. Но если попробовать статически слинковать бинарник, линковщик ругается на dlopen() в glfw. Если вырезать dlopen, программа крашится при запуске (впрочем, если оставить, тоже краш)

При этом как бы в ldd только стандартные библиотеки:

[parthen@parthen-pc Vinora-Engine]$ ldd ./game 
	linux-vdso.so.1 (0x00007ff6a1fb9000)
	libm.so.6 => /usr/lib/libm.so.6 (0x00007ff6a1d5f000)
	libc.so.6 => /usr/lib/libc.so.6 (0x00007ff6a1a00000)
	/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007ff6a1fbb000)

Подозреваю, что я просто чего-то не знаю о работе OpenGL как такового, знающие, просветите – $subj вообще возможен?

★★

Оно тебе надо полностью статическое? В случае OpenGL программы это один фиг нереализуемо (по простой причине – OpenGL драйвер ты не слинкуешь статически).

Если вырезать dlopen, программа крашится при запуске (впрочем, если оставить, тоже краш)

Как хоть крашится-то? В выхлопе ldd нет libdl, dlopen() находится в ней.

С OpenGL в юниксах можно напрямую линковаться, но лично я предпочитаю через {glx,egl,wgl,…}GetProcAddress доставать нужные функции – проще проверять реальное наличие расширений.

a1ba ★★★
()

libdl привязал статически ? Касательно, утверждения другого товарища - сомневаюсь. Да, OpenGL драйвер действительно статически не линкуют, а подгружают его динамически как раз с помощью dlopen, что в свою очередь никак не противоречит, тому, что всё кроме OpenGL вполне можно статически связать, ищите символы которые забыли. Вырезание dlopen по сути да, нереализуемо, т.к. уже отметил, что чаще всего именно с помощью неё подгружаются символы во время работы.

anonymous
()

Касательно же падения программы - соберите отладочную версию и запустите с gdb - он вас носом ткнёт где вы что-то забыли. Плюс отмечу, что по мимо абстрактного «хочу собрать статически» желательно для начала полазить по документации используемых библиотек и подтянуть от туда детали, так емнип у того же glfw для статической сборки - ему нужно какой-то макрос или переменную во время сборки подсунуть, что-то вроде GLFW_STATIC/GLFW_BUILD_STATIC, аналогично полагаю может случится и в других библиотеках. Также раз уж вы собираете рейлиб, то зачем вы задаёте вопрос, а не ищите в их вики и на гх ?

anonymous
()
Ответ на: комментарий от anonymous

glibc хоть и реализует динамическую загрузку из статических бинарей, но делает это максимально отвратительно. При несовпадении версий glibc этоидело в лучшем случае откажется что-либо грузить, но может и упасть/зависнуть/...

mittorn ★★★★★
()
Ответ на: комментарий от Parthen

ИМХО можно остановиться на том, что твой бинарник не зависит на чем-то кроме жлибц (что в себя включает libc, libm, libdl, libpthread и librt). Остальное по вкусу.

a1ba ★★★
()
Последнее исправление: a1ba (всего исправлений: 1)
Ответ на: комментарий от anonymous

libdl привязал статически

Нет, в Арче, по всей видимости, нет статических версий этих библиотек, придется так собирать.

Также раз уж вы собираете рейлиб, то зачем вы задаёте вопрос, а не ищите в их вики и на гх ?

Потому что ничего не нашел.

Если собирать со -static (без переделки библиотек)

rglfw.c:(.text+0x3d66): предупреждение: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
[parthen@parthen-pc Vinora-Engine]$ ./game 
INFO: Initializing raylib 5.5
INFO: Platform backend: DESKTOP (GLFW)
INFO: Supported raylib modules:
INFO:     > rcore:..... loaded (mandatory)
INFO:     > rlgl:...... loaded (mandatory)
INFO:     > rshapes:... loaded (optional)
INFO:     > rtextures:. loaded (optional)
INFO:     > rtext:..... loaded (optional)
INFO:     > rmodels:... loaded (optional)
INFO:     > raudio:.... loaded (optional)
Ошибка сегментирования                (образ памяти сброшен на диск) ./game

(gdb) run
Starting program: /home/parthen/Projects/RayLib/Vinora-Engine/game 
INFO: Initializing raylib 5.5
INFO: Platform backend: DESKTOP (GLFW)
INFO: Supported raylib modules:
INFO:     > rcore:..... loaded (mandatory)
INFO:     > rlgl:...... loaded (mandatory)
INFO:     > rshapes:... loaded (optional)
INFO:     > rtextures:. loaded (optional)
INFO:     > rtext:..... loaded (optional)
INFO:     > rmodels:... loaded (optional)
INFO:     > raudio:.... loaded (optional)
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7896e08 in pthread_create () from /usr/lib/libc.so.6
(gdb) backtrace
0  0x00007ffff7896e08 in pthread_create () from /usr/lib/libc.so.6
1  0x00007ffff4b67637 in ?? () from /usr/lib/libgallium-25.2.2-arch1.2.so
2  0x00007ffff4b21404 in ?? () from /usr/lib/libgallium-25.2.2-arch1.2.so
3  0x00007ffff4e5e6d0 in ?? () from /usr/lib/libgallium-25.2.2-arch1.2.so
4  0x00007ffff4e55c1c in ?? () from /usr/lib/libgallium-25.2.2-arch1.2.so
5  0x00007ffff4e593aa in ?? () from /usr/lib/libgallium-25.2.2-arch1.2.so
6  0x00007ffff46edaef in ?? () from /usr/lib/libgallium-25.2.2-arch1.2.so
7  0x00007ffff463deb7 in ?? () from /usr/lib/libgallium-25.2.2-arch1.2.so
8  0x00007ffff4641f3b in driCreateContextAttribs () from /usr/lib/libgallium-25.2.2-arch1.2.so
9  0x00007ffff74b65f0 in ?? () from /usr/lib/libGLX_mesa.so.0
10 0x00007ffff74b5529 in ?? () from /usr/lib/libGLX_mesa.so.0
11 0x00007ffff75787ab in ?? () from /usr/lib/libGLX.so.0
12 0x000000000048e111 in _glfwCreateContextGLX ()
13 0x000000000048ec80 in _glfwCreateWindowX11 ()
14 0x000000000047f288 in glfwCreateWindow ()
15 0x0000000000429f0a in InitPlatform ()
16 0x000000000042ac91 in InitWindow ()
17 0x0000000000403178 in main ()



Parthen ★★
() автор топика