Czy plik zgłaszany jako „niedynamiczny plik wykonywalny” przez „ldd” zależy od innych bibliotek?

9

Tylko upewniam się, że mam rację - dzwonię

ldd /path/to/executable

i zwraca „nie dynamiczny plik wykonywalny”. Oznacza to, że nie zależy to od innych bibliotek, prawda? Jeśli tak, czy oznacza to, że można go przenieść do innego systemu Ubuntu bez obawy o zależności?

Jason
źródło

Odpowiedzi:

3

Zgadza się, ale jest coś do wzięcia pod uwagę.

Z strony lddpodręcznika:

ldd nie działa na bibliotekach współdzielonych a.out.

ldd nie działa z niektórymi bardzo starymi programami a.out, które zostały zbudowane przed dodaniem obsługi ldd do wydań kompilatora. Jeśli użyjesz ldd na jednym z tych programów, program spróbuje uruchomić z argc = 0, a wyniki będą nieprzewidywalne.

Eric Carvalho
źródło
3
Innym powodem może być to, że plik binarny został zbudowany dla systemu 32-bitowego, ale sprawdzasz go w systemie 64-bitowym.
Ferdinand Prantl
@FerdinandPrantl Jeśli jest zbudowany dla wersji 32-bitowej, lddnadal drukuje zależności 32-bitowe.
Calmarius
@Calmarius, co nie jest prawdą, gdy nie masz podstawowego 32-bitowego libgcc1. Właśnie zweryfikowano na nowej instalacji Ubuntu Server: Musisz zainstalować libgcc1: i386, aby ldd był zadowolony z 32-bitowych plików binarnych.
falstaff
1

@Calmarius ma rację, dzieje się tak, jeśli weźmiesz pod uwagę 32-bitowy exe, nawet bez podstawowych bibliotek 32-bitowych.

Próbuję zaktualizować swój system (nowa instalacja Ubuntu 16.04, od 12.04), muszę zainstalować starą zalecaną usługę 32-bitową avserver, która wymaga ia32-libs(już niedostępna). Oznacza to jedno dpkgi drugie i apt-getjest niezadowolony (cokolwiek robię, monituje mnie apt-get -f install, a jeśli to uruchomię, nalega, że ​​odinstaluję pakiet usług), a moja usługa się nie uruchomi.

Aby udowodnić, że przyczyną są brakujące biblioteki 32-bitowe, zamontowałem stary system (Ubuntu 12.04, z ia32-libsbibliotekami 32-bitowymi) /sda2. Zapewniając, że /opt(zawierający mój 32-bitowy plik binarny) jest podłączony /sda2/opt, mogę, chroot /sda2a lddnastępnie uruchamiać zgodnie z przeznaczeniem.

Aby to naprawić, mogłem ręcznie zainstalować wszystkie zależne pakiety bibliotek za pomocą: i386 (arch). Jednak postanowiłem, zamiast próbować dowiedzieć się, jakie były moje zależności, zainstalowałem wino (które jest w większości 32-bitowe, więc instaluję podstawowe biblioteki i ładuję więcej, których tak naprawdę nie potrzebuję, ale nie mam nic przeciwko).

Aby to naprawić dpkgi apt-getedytowałem /var/lib/dpkg/status, znajdując paczkę dla mojej usługi, i usunąłem ia32-libs. Teraz dpkgi apt-getcieszymy się

Zrobione, lddszczęśliwie raporty: - root@withnail:/opt/<service path># ldd avserver linux-gate.so.1 => (0xf77a6000) libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf778f000) libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7772000) libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xf776b000) libresolv.so.2 => /lib/i386-linux-gnu/libresolv.so.2 (0xf7752000) libcrypt.so.1 => /lib/i386-linux-gnu/libcrypt.so.1 (0xf7720000) libktssl.so.1.0.0 => /opt/<service path>/libktssl.so.1.0.0 (0xf76cb000) libktcrypto.so.1.0.0 => /opt/<service path>/libktcrypto.so.1.0.0 (0xf756b000) libktz.so.1 => /opt/<service path>/libktz.so.1 (0xf7558000) librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xf754f000) libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf73d8000) libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7383000) libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7366000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf71af000) /lib/ld-linux.so.2 (0x565b1000)

Sibaz
źródło
Instalowanie wina jest bardzo sprytną sztuczką, aby uzyskać wszystkie 32-bitowe biblioteki, których potrzebujesz !!
psitae