Как разрешить запуск двоичного файла с несколькими версиями общих библиотек

#c #go #static-linking #dynamic-linking

#c #Вперед #статическое связывание #динамическое связывание

Вопрос:

Я пытаюсь скомпилировать двоичный файл программы, которая зависит от времени сборки времени выполнения libunbound , я компилирую двоичный файл на компьютере Ubuntu 20.04 (используя go build -tags unbound ), и он работает.

Когда я пытаюсь запустить один и тот же двоичный файл в моей установке Arch (с unbound установленным), я получаю:

 error while loading shared libraries: libunbound.so.2: cannot open shared object file: No such file or directory
 

вывод ldd file :

     linux-vdso.so.1 (0x00007ffffe1b0000)
    libunbound.so.2 => /usr/lib/x86_64-linux-gnu/libunbound.so.2 (0x00007fdf775c5000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fdf773a6000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdf76fb5000)
    ...
 

Похоже, что моя установка arch не libunbound.so.2 работает. Но у него есть libunbound.so.8

 #ldconfig -p | grep unbound                                                                                                            
    libunbound.so.8 (libc6,x86-64) => /usr/lib/libunbound.so.8
    libunbound.so (libc6,x86-64) => /usr/lib/libunbound.so
 

Я предполагаю, что мне придется установить любой пакет, который мне предоставит libunbound.so.2 (но это выглядит как трудная задача), есть ли способ, которым я могу связать libunbound.so.2 с двоичным файлом, чтобы он работал на всех машинах / дистрибутивах, без необходимости пользователю беспокоиться о зависимостях во время выполнения. Я слышал о статическом связывании, но я не уверен, что это то, что я здесь ищу. Мои попытки «статического» связывания с использованием моих ограниченных знаний C / go ни к чему не привели.

Я также открыт для любых статей с пояснениями, связанными с этим.

Я тоже пытался это делать go build -tags unbound -ldflags="-extldflags=-static" , но получил:

 /usr/lib/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
/usr/bin/ld: cannot find -lunbound
/usr/bin/ld: /tmp/go-link-436597878/000004.o: in function `_cgo_26061493d47f_C2func_getaddrinfo':
/tmp/go-build/cgo-gcc-prolog:58: warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
collect2: error: ld returned 1 exit status
 

Я также попытался сделать это на компьютере с Ubuntu (поскольку в arch install, похоже, не было файла libunbound.a), вместо этого я получил это:

 /snap/go/7013/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
/tmp/go-link-821192870/000004.o: In function `_cgo_26061493d47f_C2func_getaddrinfo':
/tmp/go-build/cgo-gcc-prolog:58: warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_ctx_add_ta':
/tmp/go-build/cgo-gcc-prolog:161: undefined reference to `ub_ctx_add_ta'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_ctx_add_ta_file':
/tmp/go-build/cgo-gcc-prolog:181: undefined reference to `ub_ctx_add_ta_file'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_ctx_config':
/tmp/go-build/cgo-gcc-prolog:201: undefined reference to `ub_ctx_config'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_ctx_create':
/tmp/go-build/cgo-gcc-prolog:218: undefined reference to `ub_ctx_create'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_ctx_data_add':
/tmp/go-build/cgo-gcc-prolog:238: undefined reference to `ub_ctx_data_add'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_ctx_data_remove':
/tmp/go-build/cgo-gcc-prolog:258: undefined reference to `ub_ctx_data_remove'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_ctx_debuglevel':
/tmp/go-build/cgo-gcc-prolog:279: undefined reference to `ub_ctx_debuglevel'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_ctx_debugout':
/tmp/go-build/cgo-gcc-prolog:299: undefined reference to `ub_ctx_debugout'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_ctx_get_option':
/tmp/go-build/cgo-gcc-prolog:332: undefined reference to `ub_ctx_get_option'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_ctx_hosts':
/tmp/go-build/cgo-gcc-prolog:352: undefined reference to `ub_ctx_hosts'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_ctx_resolvconf':
/tmp/go-build/cgo-gcc-prolog:372: undefined reference to `ub_ctx_resolvconf'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_ctx_set_fwd':
/tmp/go-build/cgo-gcc-prolog:392: undefined reference to `ub_ctx_set_fwd'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_ctx_set_option':
/tmp/go-build/cgo-gcc-prolog:413: undefined reference to `ub_ctx_set_option'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_ctx_trustedkeys':
/tmp/go-build/cgo-gcc-prolog:433: undefined reference to `ub_ctx_trustedkeys'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_ctx_zone_add':
/tmp/go-build/cgo-gcc-prolog:454: undefined reference to `ub_ctx_zone_add'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_ctx_zone_remove':
/tmp/go-build/cgo-gcc-prolog:474: undefined reference to `ub_ctx_zone_remove'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_resolve':
/tmp/go-build/cgo-gcc-prolog:497: undefined reference to `ub_resolve'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_strerror':
/tmp/go-build/cgo-gcc-prolog:528: undefined reference to `ub_strerror'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_version':
/tmp/go-build/cgo-gcc-prolog:564: undefined reference to `ub_version'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_ctx_delete':
/tmp/go-build/cgo-gcc-prolog:314: undefined reference to `ub_ctx_delete'
/tmp/go-link-821192870/000006.o: In function `_cgo_4919ea55c4da_Cfunc_ub_resolve_free':
/tmp/go-build/cgo-gcc-prolog:512: undefined reference to `ub_resolve_free'
collect2: error: ld returned 1 exit status
 

Комментарии:

1. Да, если у вас есть статическая библиотека libunbound, на нее можно статически ссылаться. Это потребует некоторых знаний о том, как использовать компоновщик C.

2. @JimB Я пытался это сделать, но получил сообщение об ошибке (отредактированный вопрос с ним), можете ли вы указать ресурсы, которые могли бы помочь мне в этом?

3. cannot find -lunbound означает, что у вас нет libunbound статической библиотеки. Если у вас это есть, вам нужно будет специально связать это и все остальное, что требуется статически. Если вы хотите статически связать все, что вы пробовали, вам следует использовать libc, который может быть статически связан, а не glibc (отсюда последнее предупреждение)