Почему мне нужно установить LD_LIBRARY_PATH перед запуском программы, даже если я уже связал местоположения библиотеки на этапе компиляции? [дубликат]

Вывод из fdisk показывает, что у вас есть 4 раздела на одном диске, первый является загрузочным (вероятно, там, где установлена ​​ваша система), а третий можно использовать в качестве раздела подкачки.

fdisk показывает только разделы, но не файловые системы на этих разделах. Чтобы увидеть файловые системы, используйте sudo parted -l / dev / sda или sudo blkid -c / dev / null / dev / sda * . Если у них нет файловой системы, вам сначала нужно отформатировать их. Это можно сделать с помощью инструментов mkfs. * (предупреждение, что эти инструменты уничтожат любые данные на разделах, которые они форматируют). Например, чтобы отформатировать второй диск как ext4, выполните следующее: только , если вы уверены, что в этом разделе уже ничего нет.

sudo mkfs.ext4 /dev/sda2

Linux, в отличие от Windows, имеет глобальное дерево каталогов, в котором могут быть смонтированы файловые системы. По умолчанию дистрибутивы Linux монтируют ваш системный раздел в корень этого дерева каталогов (также известный как / или корневая файловая система). Другие разделы можно смонтировать где угодно. Вы можете увидеть список смонтированных файловых систем и места, где они смонтированы, запустив mount . В современных дистрибутивах это покажет множество виртуальных файловых систем, вы можете отфильтровать их, запустив mount | grep '^ / dev' .

Чтобы смонтировать файловую систему в дерево каталогов, вы можете выполнить следующее:

sudo mount /dev/sdXY /path/to/mount/point

Например, чтобы смонтировать второй раздел (при условии, что на нем есть файловая система) в / mnt / p2 (это типичное место, где вы помещаются внутренние / смонтированные вручную файловые системы; но это может быть любой путь по вашему выбору) run

sudo mkdir /mnt/p2
sudo mount /dev/sda2 /mnt/p2

Теперь любой файл, который вы пишете в / mnt / p2, будет записан на ваш второй раздел. Это будет длиться только до перезагрузки, чтобы ваша система перемонтировала ее при загрузке, добавьте следующую строку в / etc / fstab (при условии, что она отформатирована с помощью ext4).

/dev/sda2               /mnt/p2           ext4            defaults    0 0

Чтобы проверить эту запись, вы можете размонтировать ее с помощью unmount / mnt / p2 ; если он установлен. Затем запустите mount -a , чтобы смонтировать все, что указано в / etc / fstab .

Традиционно внутренние диски настраиваются в Linux, поэтому по умолчанию это разрешено делать только root, поэтому ваш браузер файлов GUI не может, но функция, которая перечисляет разделы, включена для съемных носителей, которые пользователям разрешено монтировать на современных дистрибутивы linux. Это также дает вам быстрый доступ к корню ваших файловых систем после монтирования. Гораздо проще просто настроить диски для монтирования при загрузке, чем позволить пользователям монтировать их по своему желанию.

2
19.02.2018, 22:23
1 ответ

Aunque todo el mundo utiliza la compilación en el sentido coloquial de convertir el código fuente en un ejecutable, técnicamente es un solo paso en un conducto bastante largo:

  1. El archivo de entrada se ejecuta a través del preprocesador, lo que resulta en una sola unidad de traducción.
  2. La salida del preprocesador se compila en ensamblador.
  3. El ensamblador lo toma como entrada y genera un archivo de objeto.
  4. El enlazador une los archivos de objeto para producir un ejecutable.

[ Para ser pedante, no es necesario que los pasos estén separados y los compiladores modernos generalmente los combinan para lograr eficiencia. ]

Nuestra preocupación es el paso de vinculación, que combina su código con las bibliotecas estándar del sistema. El enlazador copia objetos de bibliotecas estáticas directamente en el ejecutable. Sin embargo, para las bibliotecas compartidas, solo proporciona una referencia a la biblioteca.

Las bibliotecas compartidas tienen muchas ventajas. Puede actualizarlos sin volver a compilar los programas y usan menos memoria porque los programas pueden compartir código común. También tienen el inconveniente obvio de que el código no está en el ejecutable.

La ​​solución a eso es el cargador dinámico, que es responsable de resolver todas las referencias de bibliotecas compartidas en tiempo de ejecución. El cargador se ejecuta automáticamente; las instrucciones para hacerlo son algo que el enlazador incluye en el ejecutable. Por supuesto, esto presupone que el cargador puede encontrar las bibliotecas.

Las bibliotecas del sistema están en directorios estándar, lo cual es sencillo. Cuando ese no es el caso, el cargador buscará LD _BIBLIOTECA _PATH. ¿Por qué el enlazador simplemente no pone la ruta en el ejecutable? Porque entonces no podrías mover o cambiar la biblioteca.

En la práctica, tampoco podría mover el ejecutable, ya que la biblioteca está fuera de la ruta de búsqueda del sistema.Si solo se ejecutó cuando la biblioteca estaba ubicada en ~luke/lib, entonces no puede dárselo a joe a menos que pueda leer sus archivos. Apesta para Joe si te mudas a un nuevo trabajo.

Solo para su información, también apestaría de muchas otras maneras. La depuración sería una pesadilla eterna si solo pudiera especificar la ubicación de la biblioteca en el momento de la compilación, entre otras cosas.

6
27.01.2020, 21:55

Теги

Похожие вопросы