2016-08-12 11 views
1

Я создаю файл ELF, связывая объектные файлы с некоторыми архивными файлами. Но когда я запускаю команду «что» в моем файле ELF, я могу видеть информацию о lib (версию) только для некоторых файлов архива, а не для всех.Как добавить информацию о версии библиотеки в файл elf при связывании архивных файлов и всех архивных файлов с их информацией о версии?

Почему файл ELF имеет только информацию для некоторых файлов, даже связанную со всеми архивными файлами? (PS: Все архивные файлы имеют свою информацию о версии, проверьте в примере ниже)

Пример:

$ ld -o bos_epb.ppc.elf a.o b.o c.o -L/home/xrava/lib/powerpc \ 
    --start-group -lgcc -lm -lcrt -lsslcrypto -lssh --end-group 

Когда я бегу «что» на файл ELF я могу видеть Lib информацию о libcrt только, не все ,

$ what bos_epb.ppc.elf 
bos_epb.ppc.elf: 
    Lib crt swfp version BL910288 
    C Run Time Library 
    Built Fri 22 Apr 2016 23:31:21 +0200 by [email protected] 
    Copyright 2016 XXXXXXX 

Все мои архивы имеют информацию о своей версии, но не пишут это эльфу за исключением libcrt.

>>what libssh.a 
libssh.a: 
Lib ssh swfp version BL910291 
SSH Built Wed 27 Apr 2016 23:36:24 +0200 by [email protected] 
Copyright 2016 XXXXXXXX 

ответ

0

Все мои архивы имеют свою информацию о версии, но не пишу это, чтобы эльф, кроме libcrt.

Для того, чтобы понять этот результат, вы должны понимать

  1. Каким образом what команда работает и
  2. Как компоновщика работает.

On with the show. Команда what очень проста: она сканирует произвольный двоичный поиск и строку ASCII, начинающуюся с «специальной» последовательности символов @(#) и печатает любую строку, которая следует за этой последовательностью (заканчивается символом NUL). Documentation.

Для того, чтобы строки @(#) Lib ssh swfp version BL910291 появляться в связанном исполняемом bos_epb.ppc.elf, то объект файл, содержащий эту строку должен быть выбран из libssh.a, чтобы стать частью исполняемого файла. Это подводит нас к вопросу № 2 выше.

Просто потому, что такой объект присутствует в libssh.a, вы не можете предположить, что он будет связан с окончательным двоичным кодом. Алгоритм, используемый компоновщиком для определения того, включать ли объект в конечный исполняемый файл или нет, описан here или here.

Вы можете , что гарантия вся libssh.a включена в окончательный двоичном с помощью -Wl,--whole-archive -lssh -Wl,--no-whole-archive, но это плохо -advised. Это может привести к тому, что ваш двоичный файл не сможет подключиться, и гарантирует, чтобы сделать его больше, чем должно быть.