LINUX.ORG.RU

Существует ли компактный crt как замена libc?

 , , , ,


0

3

В общем, хочется отвязать библиотеки от libc. Это позволит загружать их из статических бинарников
В библиотеках нет ничего что взаимодействует с системой. Есть только fopen, но он опционален. Остальное - только самостоятельный код. Однако используются строковые и математические функции.
После избавления от строковых функций библиотека загружается как на linux, так и на freebsd (использовался системный libstdc++ и libm), но в обоих случаях ломается завязанный на них функционал.
Дополнительной проблемой при статической сборке встаёт привязанный к libc libstdc++ - ему нужно гораздо больше, чем собираемой библиотеке
Была ещё идея влинковывания libc внутрь библиотеки, но glibc и uclibc не любят такое, а с musl надо ещё возиться, притом что мне кажется, что оно тоже не заработает.
Есть ли что-то, чем можно заменить libc?

★★★★★

Ответ на: комментарий от anonymous

dietlibc не может в c++.
musl используется в shared библиотеках в emscripten, но там идёт эмуляция системы вместо взаимодействия с ней и она уже расчитана на такую работу, что же касается непосредственной загрузки shared - пока не знаю.

mittorn ★★★★★
() автор топика

запили свою libc, это совершенно не трудно. макросы обертки для системных вызовов можешь подсмотреть, например, в newlib или musl + нужно будет сгенерировать платформозависимые хедеры. делов на один вечер.

anonymous
()

перечитал ОП и понял, что тебе просто нужен entry код, который дергает main

вот это прокатит на x86-64

.global _start
_start:
	pop %rdi
	mov %rsp, %rsi
	call _main
loop:	jmp loop

rsi = argc

rdi = argv

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

блин, sys_exit завтыкал после main

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

нет, мне наоборот надо скорее всё кроме него т.к для основного бинарника будет использоваться полноценный libc. А вот загружаемые модули хотелось бы отвязать от него.
Если влинковать libc в shared-библиотеки - начанаются проблемы ещё на стадии выполнения конструкторов, либо даже до неё - uclibc просто зависает в цикле при разрешении релокаций..

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

ну так мне не надо системных вызовов даже. Нужен libm, libstdc++, ctype и строковые функции.

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

Возможно, newlib и так подойдёт

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

для основного бинарника будет использоваться полноценный libc. А вот загружаемые модули хотелось бы отвязать от него.

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

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

Смысл в том чтобы не тащить линкер отдельно т.к невозможно сделать динамический путь к динамическому линкеру. static сборка не имеет этой проблемы.

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

Речь об ld.so? Но если «для основного бинарника будет использоваться полноценный libc», динамически скомпонованный, то ld.so всё равно понадобится. Или основной бинарник будет статически линковаться с libc?

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

Основной статически. А в загружаемых используемый функционал libc имеет незначительную нагрузку и скорее всего влезет в несколько десятков килобайт

mittorn ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.