Linux: Возможно ли сделать какое-нибудь плагин-ориентированное программирование с использованием статически связанных двоичных файлов? - PullRequest
2 голосов
/ 16 декабря 2011

Предположим, у нас очень маленькая встроенная система, состоящая только из ядра Linux и одного статически связанного двоичного файла, запускаемого как init.Мы хотим, чтобы бинарный файл мог динамически загружать внешние плагины во время выполнения.

Возможно ли это в Linux?Dlopen работает только с общими библиотеками и динамическими ссылками, потому что статические двоичные файлы не экспортируют символы во внешний мир, так есть ли другой способ сделать это?

Ответы [ 2 ]

4 голосов
/ 16 декабря 2011

Вы можете запускать «плагины» как дочерние процессы и взаимодействовать по IPC (совместно используемая память, каналы и т. Д.).

Они будут существовать в своем собственном пространстве процессов, поэтому вы не сможете напрямуювызывать функции в них (кроме того, если они также статически связаны, у вас не будет никаких точек входа в функцию, кроме main, которые вы могли бы достичь), но вы могли бы (например) отправить команду по именованному каналу, илипередавать данные в структуре разделяемой памяти.

Обратите внимание, что в момент загрузки второго двоичного файла вы потеряли одно из основных преимуществ статического связывания (поскольку теперь у вас есть две загруженные копии libc), так что вы можете рассмотреть возможность просто кусать пули и использовать динамическое связывание.При добавлении поддержки динамической компоновки вы потратите несколько сотен тысяч, но GNU libc составляет около 2 миллионов, так что если вы загружаете один плагин, вы уже сэкономили, возможно, 1,8 миллиона;и для каждого дополнительного подключаемого модуля вы экономите около 2 млн.

1 голос
/ 16 декабря 2011

Dlopen работает только с общими библиотеками и динамическими ссылками, потому что статические двоичные файлы не экспортируют символы во внешний мир

При использовании glibc вы можете извлечь разделяемую библиотеку из статически связанного двоичного файла. Если вам нужен ваш плагин для ссылки на символы из основного исполняемого файла, вам нужно будет передать им указатели в плагин, аналогично this .

Есть ли другой способ сделать это?

Вы также можете написать свой собственный загрузчик модулей. Ядро Linux делает то же самое, и Xorg.

...