Какие различия и отношения существуют между различными `libc.so`?

EDIT

Пользователь сильно изменил свой вопрос, этот ответ был редактированием кода, который пользователь разместил и который больше не существует в его вопросе.

Есть новый код, и вопрос изменился на что-то другое.

Таким образом, этот ответ следует рассматривать как старый (и недействительный) код.

Оригинальный

Если я правильно понимаю ваш код.
Вы используете eval только для того, чтобы получить значение двух переменных внутри вашего кода.
Это считается "плохой практикой".

Если вы измените ваш исходный файл с:

LINK=(SRC=/.hd/home/younes/.conky DST=/home/younes/.conky)

на

/.hd/home/younes/.conky /home/younes/.conky

или даже если вы вставите пару значений в документ here, этот код сделает то же самое без eval:

while read SRC DST
do
    [[ ! -e $SRC ]] && [[ ! -e $DST ]] && echo "oOpsS! $DST" && exit
    [[ ! -e $SRC ]] &&  mv "$DST" "$SRC"
    [[ ! -e $DST ]] &&  $LINKIT "$SRC" "$DST"
    ls -l "$DST" | grep "$SRC" &>/dev/null || $LINKIT "$SRC" "$DST"
done <<\_list_of_dir_pairs_
/.hd/home/younes/.conky             /home/younes/.conky
/.hd/home/younes/.fonts             /home/younes/.fonts
/.hd/home/younes/.thumbnails        /home/younes/.thumbnails
/.hd/home/younes/.xbindkeys         /home/younes/.xbindkeys
/.hd/home/younes/.xbindkeys_config  /home/younes/.xbindkeys_config
/.hd/home/younes/.xbindkeysrc       /home/younes/.xbindkeysrc
_list_of_dir_pairs_

И, если вам действительно нужен массив LINK, сделайте:

LINK=($SCR $DST)

Обратите внимание, что я процитировал var расширения SRC и DST в mv и LINKIT, и изменил LINKIT на $LINKIT (я предполагаю, что это переменная, а не функция. Если нужно, измените обратно).

0
11.06.2018, 16:44
1 ответ

Todos sirven para diferentes propósitos:

  • /lib/i386-linux-gnu/libc.so.6es un enlace simbólico a la biblioteca C x86 de 32 -bits, utilizada para ejecutar ejecutables de 32 -bits;
  • /lib/x86_64-linux-gnu/libc.so.6es un enlace simbólico a la biblioteca C x86 de 64 -bits, utilizada para ejecutar ejecutables de 64 -bits;
  • /usr/lib/x86_64-linux-gnu/libc.soes (generalmente )un script de enlace que apunta a la biblioteca C de 64 -bits (dinámico o compartido, según sea necesario )y enlazador dinámico, y se usa para enlazar 64 -ejecutables de bits (al construirlos ).

Hay tres tipos diferentes de vinculación al crear y ejecutar programas:

  • enlace estático :el enlazador de tiempo de compilación -(ld)resuelve todos los objetos usados ​​en el programa durante la compilación, fusiona los objetos que se usan y produce un binario ejecutable que no usa bibliotecas externas;
  • enlace dinámico, en el momento de la compilación -:ldresuelve todos los objetos utilizados en el programa, pero en lugar de almacenarlos en el ejecutable, solo almacena referencias a ellos;
  • enlace dinámico, en el tiempo de ejecución -:el enlazador de tiempo de ejecución -(ld.so), o enlazador dinámico, resuelve todas las referencias almacenadas en el ejecutable, cargando todas las bibliotecas requeridas y actualizando todas las referencias de objetos antes de ejecutar el programa.

La secuencia de comandos del enlazador libc.soproporciona instrucciones para ld, en forma de secuencia de comandos del enlazador:

/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /lib/x86_64-linux-gnu/libc.so.6 /usr/lib/x86_64-linux-gnu/libc_nonshared.a  AS_NEEDED ( /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 ) )

Por lo general, las bibliotecas dinámicas se configuran utilizando enlaces simbólicos solo(libfoo.soes utilizado por ld, y apunta a libfoo.so.1o lo que sea que sea utilizado por ld.so, y es en sí mismo típicamente un enlace simbólico al actual -versión instalada de la biblioteca, por ejemplolibfoo.so.1.2.3). En el caso de la biblioteca GNU C, aunque los programas que se vinculan dinámicamente todavía necesitan algunos símbolos de la biblioteca estática, por lo que se usa un script de enlace para que el enlace pueda probar ambos. La secuencia de comandos del enlazador también hace referencia al enlazador dinámico que se usará en tiempo de ejecución(/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2arriba ), y cuyo nombre está incrustado en los ejecutables (en.interp).

Los términos "vinculador dinámico" y "cargador dinámico" son sinónimos y se usan indistintamente (consulte la página de manual ld.so).

5
28.01.2020, 02:23

Теги

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