LINUX.ORG.RU

В чём смысл исполняемых библиотек?

 


0

1

На досуге курил сборку библиотеки наткнулся на информацию, что библиотеку можно сделать исполняемой, прописав в ней функцию main() и дописав несколько опций в компилятор. Теперь сижу и чешу репу. В чём суть вообще такого? В моём понимании в библиотеку выносится такой код, который может использоваться разными программами. Какой практический смысл делать из самой библиотеки программу?


Если я правильно понял то вот тебе пример: есть libcurl которая предоставляет api и если «дописать» то получим curl , программа которая позволяет воспользоваться функциями libcurl. И почему это не может быть в одном месте? Хочешь - собирай как либу, хочешь - как приложение.

ЗЫ curl тут просто как пример, я хз какие опции сборки он предоставляет

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

И почему это не может быть в одном месте?

Тогда теряется смысл разделяемой библиотеки, нет? Вроде как смысл библиотек как раз в том, чтоб вынести код, который может использоваться совместно разными программами, в библиотеку. А так получается, что идёт компановка не с библиотекой, а с программой.

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

А так получается, что идёт компановка не с библиотекой, а с программой.

У тебя чувство прекрасного ущемлено? Хочешь линкуйся, а хочешь в шелле выполняй, в чём проблема?

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

НУ по такой логике в любом случае препроцессор всё заиклудит, а потом линкер объектники объединит и допишет pe\elf метаинформацию :) Всё упирает в удобство для потребителей.

Смысл в том что современные линкеры в состоянии найти неиспользуемые секции и выкинуть их. Для программ нужен main, у либ тоже есть свой DllMain (win).

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

Тут всё в устройство ОС и формата файла упирается: можно либу использовать как shared - никаких проблем, а можно собрать static чтоб не зависеть не от чего (например чтоб собрать минимальное окружение inirtd = busybox + static либы). А мог автор подумать и предложить сразу и приложение (main) чтобы могли сразу использовать функции.

Каждому всё.

Вот например header-only либа которая представляет из себя http server: настройки через дефайны, а значит я могу подключить как хидер, скомпилить в объектник и слинковать, а могу дефайном дописать main.

Очень грубый пример (тут без main) https://github.com/yhirose/cpp-httplib

CrazyAlex25 ★★★
()

Библиотека это тоже ELF, отличия между исполняемым файлом и библиотекой были настолько малы, что решили оставить это как фичу, это мое предположение.

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)

Ну например такое часто используется в питоне: есть какой-то фреймфорк, он используется как библиотека. Но можно вызвать и python -m <framework> и он будет выполнять функции утилиты - например, шаблон проекта под себя создавать или миграции проводить. В компилируемом мире конечно в этом смысла нет - исполняемые файлы и библиотеки лежат в разных местах, пути к библиотеками нет в PATH, а пути к бинарникам в путях линкера. И нет никаких проблем поставить библиотеку и бинарник из одного проекта. Поэтому то что такое возможно - просто побочный эффект универсальности ELF.

anonymous
()
/lib/x86_64-linux-gnu/ld-2.31.so --list /usr/bin/ed
        linux-vdso.so.1 (0x00007fffc642d000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007faccd180000)
        /lib64/ld-linux-x86-64.so.2 => /lib/x86_64-linux-gnu/ld-2.31.so (0x00007faccd398000)
vM ★★
()