LINUX.ORG.RU

Как линковать rust при помощи LLD?

 , , ,


1

3

Здравствуйте. Веб-макака тычет палкой в инструметы для серьезных дядь.

Поставил rust через rustup. Создал main.rs с, который выводит «Hello, world». Делаю «rustc main.rs». Получаю «linker `cc` not found».

GCC это слишком просто. Поэтому поставил LLD. Запускаю «rustc -C linker=ld.lld main.rs», получаю это (вкратце «ld.lld: error: unable to find library -ldl»)

Добавление -L ничего не изменило. Даже отрыл где-то опцию «linker-flavor=ld». Тоже без изменений. («rustc -C linker=ld.lld -L /lib/x86_64-linux-gnu/ main.rs»)

В таком виде та же ошибка:

rustc -C prefer-dynamic -C linker-flavor=ld  -C link-arg='-L /lib/x86_64-linux-gnu' --crate-type=bin -C linker=ld.lld

Может ему нужны статические версии libdl, libpthread итд (хотя я явно указал prefer-dynamic)? Стесняюсь спросить, где их взять в убунте?

Подскажите, как линковать через LLD?

Deleted

Последнее исправление: Deleted (всего исправлений: 2)

Ответ на: комментарий от creazero

Если с самого начала читать, то вроде всё у них линкуется и даже кросс-компилится.

Deleted
()

Интересно, что LLD в связке musl линкуется:

rustc -C linker-flavor=ld.lld --target x86_64-unknown-linux-musl main.rs

А вот без musl фиг. Несмотря на то, что в линкер приходит путь к библиотекам:

error: linking with `lld` failed: exit code: 1
  |
  = note: «lld» "-flavor" «gnu» "-L" «/home/user/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib» «main.main.7rcbfp3g-cgu.0.rcgu.o» «main.main.7rcbfp3g-cgu.1.rcgu.o» «main.main.7rcbfp3g-cgu.2.rcgu.o» «main.main.7rcbfp3g-cgu.3.rcgu.o» «main.main.7rcbfp3g-cgu.4.rcgu.o» «main.main.7rcbfp3g-cgu.5.rcgu.o» "-o" «main» «main.4s37gsrti678ik8u.rcgu.o» "--gc-sections" "-pie" "-zrelro" "-znow" "-L" «/home/user/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib» "--start-group" "-Bstatic" «/home/user/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-e0b6e478e9762da9.rlib» «/home/user/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-765c392663bd34b7.rlib» «/home/user/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libbacktrace_sys-1059e0ba7f05fd67.rlib» «/home/user/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-85b43da92537c77f.rlib» «/home/user/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-f8a77019eff82b98.rlib» «/home/user/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-1d32a47a0bdcb0a2.rlib» «/home/user/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-c47e11e0b4c869e2.rlib» «/home/user/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-5a60e280b382f06e.rlib» «/home/user/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-8010f7064010be9c.rlib» "--end-group" «/home/user/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-566972fa63f867ee.rlib» "-Bdynamic" "-ldl" "-lrt" "-lpthread" "-lgcc_s" "-lc" "-lm" "-lrt" "-lpthread" "-lutil" "-lutil" "-L /lib/x86_64-linux-gnu"
  = note: lld: error: unable to find library -ldl
          lld: error: unable to find library -lrt
          lld: error: unable to find library -lpthread
          lld: error: unable to find library -lgcc_s
          lld: error: unable to find library -lc
          lld: error: unable to find library -lm
          lld: error: unable to find library -lrt
          lld: error: unable to find library -lpthread
          lld: error: unable to find library -lutil
          lld: error: unable to find library -lutil

Deleted
()

Да вроде компилируется.
Первое сообщение я удалил, так как прокосоглазил насчёт lld.
И с lld вроде тоже без проблем.
rustc -C linker=lld main.rs -L/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/ -L/usr/lib64
$ lld --version
lld is a generic driver.
Invoke ld.lld (Unix), ld64.lld (macOS), lld-link (Windows), wasm-ld (WebAssembly) instead
$ ldd main
linux-vdso.so.1 (0x00007fff2fb22000)
libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007f05737d3000)
librt.so.1 => /usr/lib64/librt.so.1 (0x00007f05737c9000)
libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007f05737a5000)
libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/libgcc_s.so.1 (0x00007f057378b000)
libc.so.6 => /usr/lib64/libc.so.6 (0x00007f05735b4000)
libm.so.6 => /usr/lib64/libm.so.6 (0x00007f0573469000)
libutil.so.1 => /usr/lib64/libutil.so.1 (0x00007f0573462000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0573824000)

И ещё
rustc -C linker=ld.lld main.rs -L/usr/lib/gcc/x86_64-pc-linux-gnu/9.1.0/ -L/usr/lib64
ld.lld --version
LLD 8.0.0 (compatible with GNU linkers)

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

ЧЯДНТ? Какая у тебя версия LLD? У меня в таком виде не компилит:

rustc -C linker-flavor=ld.lld main.rs -L/usr/lib/gcc/x86_64-linux-gnu/9/ -L/usr/lib -L/lib/x86_64-linux-gnu/

$ locate libdl.so

/lib/i386-linux-gnu/libdl.so.2
/lib/x86_64-linux-gnu/libdl.so.2
/snap/core/6673/lib/i386-linux-gnu/libdl.so.2
/snap/core/6673/lib/x86_64-linux-gnu/libdl.so.2
/snap/core/6818/lib/i386-linux-gnu/libdl.so.2
/snap/core/6818/lib/x86_64-linux-gnu/libdl.so.2
/snap/core/6964/lib/i386-linux-gnu/libdl.so.2
/snap/core/6964/lib/x86_64-linux-gnu/libdl.so.2
/snap/core18/782/lib/i386-linux-gnu/libdl.so.2
/snap/core18/782/lib/x86_64-linux-gnu/libdl.so.2
/snap/core18/941/lib/i386-linux-gnu/libdl.so.2
/snap/core18/941/lib/x86_64-linux-gnu/libdl.so.2
/snap/core18/970/lib/i386-linux-gnu/libdl.so.2
/snap/core18/970/lib/x86_64-linux-gnu/libdl.so.2



$ ls /usr/lib/gcc/x86_64-linux-gnu/9/

crtbegin.o     crtoffloadbegin.o  include            libatomic.so    libgcov.a   liblsan_preinit.o   libtsan.so
crtbeginS.o    crtoffloadend.o    include-fixed      libbacktrace.a  libgomp.a   liblsan.so          libubsan.a
crtbeginT.o    crtoffloadtable.o  libasan.a          libgcc.a        libgomp.so  libquadmath.a       libubsan.so
crtend.o       crtprec32.o        libasan_preinit.o  libgcc_eh.a     libitm.a    libquadmath.so
crtendS.o      crtprec64.o        libasan.so         libgcc_s.so     libitm.so   libssp_nonshared.a
crtfastmath.o  crtprec80.o        libatomic.a        libgcc_s.so.1   liblsan.a   libtsan.a
Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Да, 8.0.0
Если не указывать -L то у меня те же самые ошибки

$ rustc -C linker=ld.lld main.rs
error: linking with `ld.lld` failed: exit code: 1
|
= note: «ld.lld» "-L" «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib» «main.main.7rcbfp3g-cgu.0.rcgu.o» «main.main.7rcbfp3g-cgu.1.rcgu.o» «main.main.7rcbfp3g-cgu.2.rcgu.o» «main.main.7rcbfp3g-cgu.3.rcgu.o» «main.main.7rcbfp3g-cgu.4.rcgu.o» «main.main.7rcbfp3g-cgu.5.rcgu.o» "-o" «main» «main.4s37gsrti678ik8u.rcgu.o» "--gc-sections" "-pie" "-zrelro" "-znow" "-L" «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib» "--start-group" "-Bstatic" «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/libstd-6d22c06da66a4b2d.rlib» «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-635c7562a980a53d.rlib» «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/libbacktrace_sys-3d2db87e25f8f305.rlib» «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-21a5fdc02a181a74.rlib» «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-a8ec976b6d076dc0.rlib» «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-69a640fedd9555d1.rlib» «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-cfce7f9082946bcc.rlib» «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-a2f15f2711b0570d.rlib» «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/libcore-649e23372b121d71.rlib» "--end-group" «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-caf27198e5bb2620.rlib» "-Bdynamic" "-ldl" "-lrt" "-lpthread" "-lgcc_s" "-lc" "-lm" "-lrt" "-lpthread" "-lutil" "-lutil"
= note: ld.lld: error: unable to find library -ldl
ld.lld: error: unable to find library -lrt
ld.lld: error: unable to find library -lpthread
ld.lld: error: unable to find library -lgcc_s
ld.lld: error: unable to find library -lc
ld.lld: error: unable to find library -lm
ld.lld: error: unable to find library -lrt
ld.lld: error: unable to find library -lpthread
ld.lld: error: unable to find library -lutil
ld.lld: error: unable to find library -lutil


error: aborting due to previous error

Но при добавлении параметра библиотеки находятся.
Сейчас будет недостаток только одной:

$ rustc -C linker=ld.lld main.rs -L/usr/lib64
error: linking with `ld.lld` failed: exit code: 1
|
= note: «ld.lld» "-L" «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib» «main.main.7rcbfp3g-cgu.0.rcgu.o» «main.main.7rcbfp3g-cgu.1.rcgu.o» «main.main.7rcbfp3g-cgu.2.rcgu.o» «main.main.7rcbfp3g-cgu.3.rcgu.o» «main.main.7rcbfp3g-cgu.4.rcgu.o» «main.main.7rcbfp3g-cgu.5.rcgu.o» "-o" «main» «main.4s37gsrti678ik8u.rcgu.o» "--gc-sections" "-pie" "-zrelro" "-znow" "-L" «/usr/lib64» "-L" «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib» "--start-group" "-Bstatic" «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/libstd-6d22c06da66a4b2d.rlib» «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-635c7562a980a53d.rlib» «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/libbacktrace_sys-3d2db87e25f8f305.rlib» «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-21a5fdc02a181a74.rlib» «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-a8ec976b6d076dc0.rlib» «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-69a640fedd9555d1.rlib» «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-cfce7f9082946bcc.rlib» «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-a2f15f2711b0570d.rlib» «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/libcore-649e23372b121d71.rlib» "--end-group" «/usr/lib64/rust-1.35.0/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-caf27198e5bb2620.rlib» "-Bdynamic" "-ldl" "-lrt" "-lpthread" "-lgcc_s" "-lc" "-lm" "-lrt" "-lpthread" "-lutil" "-lutil"
= note: ld.lld: error: unable to find library -lgcc_s


error: aborting due to previous error

Но, у меня не ubuntu.

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

Сук, реально. Сделал симлинк libdl.so.2 -> libdl.so, ошибка по этой либе пропала. Это вообще норма? Что не так с этим миром? Это убунта козел, что не сделала симлинки или LLD тупой или я что-то не догоняю?

Deleted
()
Последнее исправление: Deleted (всего исправлений: 2)
Ответ на: комментарий от Deleted

Я уже не за компом, потом гляну и напишу.
Сделай от root команду ldconfig. Симлинки должны проставиться. И lld в отсутствии симлинков не виноват.

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

Спасибо, разобрался только что. Нужные либы нашлись в /usr/lib/x86_64-linux-gnu. locate эту папку не показывала

Собраться оно собралось, но при запуске ./main пишет не «Hello, world», а «Segmentation fault»

Бинарник: https://cloud.mail.ru/public/AGUk/5KnA8pQ7X

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

У меня аналогично. Все работает.

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

Сук, реально. Сделал симлинк libdl.so.2 -> libdl.so, ошибка по этой либе пропала.

Капец. Рано тебе в это. Серьезно. Это базовые вещи, которые ты пытаешься перестановкой решить. Это так не работает.

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

Сделал симлинк libdl.so.2 -> libdl.so, ошибка по этой либе пропала. Это вообще норма?

да, man soname

annulen ★★★★★
()
Ответ на: комментарий от imul
$ ldd main
	linux-vdso.so.1 (0x00007ffdd4fa6000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f56340f3000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f56340e8000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f56340c7000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f56340ad000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5633ec2000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5633d74000)
	libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f5633d6d000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f5634121000)

Проверил, все либы на своих местах

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

Узри же :)

fn main() {
    println!("Hello, world!");
}
Deleted
()
Ответ на: комментарий от anonymous

Ну если такой опытный, объясни, поцчему locate libdl.so не показало путь /usr/lib/x86_64-linux-gnu/? Что за байда с разделением на /lib/x86_64-linux-gnu/ и /usr/lib/x86_64-linux-gnu/? Оба имеют симлмнки друг на друга, причем в первой нет симлмнков без номера в конце, а во втрой есть

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

locate libdl.so не показало путь

Путь показывается из базы. База обновляется руками или по крону командой updatedb. База может быть просто устаревшей, или неполной.

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

а что за дистрибутив? в debian stretch никаких кросс-симлинков нет

maloi ★★★★★
()

Rust изначально спроэктирован так чтобы создавать проблемы стандартным линкерам. Это одна из главных причин почему он не взлетит.

cvv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.