Как получить номер версии библиотеки в Linux

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Как получить номер версии библиотеки в Linux

Сообщение mrPG » 03.08.2022 11:57:14

Alexx2000 писал(а):Путь до загруженной библиотеки можно узнать так, пример:
Код: Выделить всё
    h:= LoadLibrary('libc.so.6');
    @getrandom:= GetProcAddress(H, 'getrandom');
    WriteLn('LIB: ', mbGetModuleName(@getrandom));

результат
LIB: /usr/lib/libc.so.6


mrPG писал(а):К сожалению, для *.so получаю сообщение No version info load ((

Вот рабочая демка, в архиве пример библиотеки с версией и консольной программы которая её читает.



Задача другая - получить номер версии библиотеки не из внешнего(консольного) приложения, а внутри нее и передать параметром в приложение.
Вызывающее приложение пишет другой программер на php, КМК, у него так не получится (

Добавлено спустя 59 секунд:
Vadim писал(а):mrPG
Давайте ещё раз уточним: Вы свою библиотеку на каком языке программирования пишите?


под Linux - Lazarus
mrPG
новенький
 
Сообщения: 10
Зарегистрирован: 25.07.2022 13:29:39

Re: Как получить номер версии библиотеки в Linux

Сообщение wavebvg » 03.08.2022 14:07:03

под Linux - Lazarus


Просто:
Добавьте свой файл ресурса и меняйте версию в нём

Сложно:
Если не хочется заморачиваться с отдельным файлом, вы можете добавить информацию в GUI. Потом научиться читать манифест из ресурсов бинарника. Когда научитесь напишите, самому интересно.

ЗЫ Вообще, я бы не заморачивался и вначале просто искал XML в бинарнике.
ЗЫ2 Но если серьёзно, то нужно прочитать ресурсы ELF файла fpc.resources

Код: Выделить всё
readelf -p fpc.resources libproject1.so


Строковый дамп раздела «fpc.resources»:
[ 1] h^R
[ 12] #
[ 29] h^R
[ 41] h^R
[ 59] h^R
[ 71] i^R
[ 78] <?xml version="1.0" encoding="UTF-8" standalone="yes"?>^M^J<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">^M^J <assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="CompanyName.ProductName.AppName" type="win32"/>^M^J <description>Your application description.</description>^M^J <dependency>^M^J <dependentAssembly>^M^J <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>^M^J </dependentAssembly>^M^J </dependency>^M^J <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">^M^J <security>^M^J <requestedPrivileges>^M^J <requestedExecutionLevel level="asInvoker" uiAccess="false"/>^M^J </requestedPrivileges>^M^J </security>^M^J </trustInfo>^M^J <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">^M^J <application>^M^J <!-- Windows Vista -->^M^J <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />^M^J <!-- Windows 7 -->^M^J <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />^M^J <!-- Windows 8 -->^M^J <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />^M^J <!-- Windows 8.1 -->^M^J <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />^M^J <!-- Windows 10 -->^M^J <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />^M^J </application>^M^J </compatibility>^M^J <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">^M^J <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">^M^J <dpiAware>False</dpiAware>^M^J </asmv3:windowsSettings>^M^J <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">^M^J ^M^J <longPathAware>false</longPathAware>^M^J


Список секций тоже можно посмотреть так:

Код: Выделить всё
readelf -l -W  libproject1.so


Тип файла ELF — DYN (Совм. исп. объектный файл)
Точка входа 0x4b010
Имеется 7 заголовков программы, начиная со смещения 64

Заголовки программы:
Тип Смещ. Вирт.адр Физ.адр Рзм.фйл Рзм.пм Флг Выравн
LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x04a1e8 0x04a1e8 R 0x1000
LOAD 0x04b000 0x000000000004b000 0x000000000004b000 0x090830 0x090830 R E 0x1000
LOAD 0x0dc000 0x00000000000dc000 0x00000000000dc000 0x013850 0x013850 R 0x1000
LOAD 0x0efe98 0x00000000000f0e98 0x00000000000f0e98 0x0361c8 0x140f28 RW 0x1000
DYNAMIC 0x0efe98 0x00000000000f0e98 0x00000000000f0e98 0x000130 0x000130 RW 0x8
GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x10
GNU_RELRO 0x0efe98 0x00000000000f0e98 0x00000000000f0e98 0x000168 0x000168 R 0x1

Соответствие раздел-сегмент:
Сегмент Разделы...
00 .hash .gnu.hash .dynsym .dynstr .rela.dyn
01 .text
02 .rodata
03 .dynamic .got .got.plt .data fpc.resources .fpcdata .bss fpc.reshandles
04 .dynamic
05
06 .dynamic .got
У вас нет необходимых прав для просмотра вложений в этом сообщении.
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35

Re: Как получить номер версии библиотеки в Linux

Сообщение mrPG » 10.08.2022 11:58:26

Прочитать номер версии файла библиотеки функцией, которая находится в этой библиотеке, у меня не удалось.
Добавлять файл ресурсов не решился.

Итоговое решение, может быть, кому-нибудь пригодится :
- написал отдельную библиотеку, в которой есть функция нахождения внутри бинарного файла информации о версии. Эта функция находит и возвращает номер версии "основной" библиотеки;
- вызывающая программа теперь сначала обращается к этой функции с указанием имени файла "основной" библиотеки и получает номер ее версии. Затем загружает и вызывает функции из "основной" библиотеки.

Решение "в лоб", но работает и не требует от разработчика вызывающей программы серьезных доработок.
mrPG
новенький
 
Сообщения: 10
Зарегистрирован: 25.07.2022 13:29:39

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

Рейтинг@Mail.ru