2013-12-11 3 views
2

Я знаю, что в Windows вы получаете некоторые библиотеки, связанные по умолчанию с вашим процессом, например kernel32.dll и т. Д. Есть ли в Linux эквивалентные библиотеки?Linux-библиотеки по умолчанию

Я создаю несколько бинарных файлов Linux и ищу поддержку подпрограмм, особенно malloc и т. Д. В Windows я просто реализовал malloc() поверх HeapAlloc (что также является подходом, принятым VS CRT), но я не конечно, что делать здесь. По причинам, я не буду ссылаться на libc при создании двоичного файла, если это вообще возможно.

+0

Насколько я знаю, libc автоматически связан gcc (и я думаю, что связь является динамической, на самом деле, поэтому она не должна занимать гораздо больше двоичного пространства). Таким образом, вы должны иметь доступ к malloc() и т. Д., Просто включив соответствующие заголовки. Какой компилятор вы собираетесь использовать? –

+1

Вы действительно спрашиваете, какие библиотеки по умолчанию, или вам просто нужен кто-то, чтобы указать вам на «-nostdlib»? – kfsone

+0

AFAIK Linux просто реагирует на системные вызовы, а libc почти напрямую использует эти системные вызовы, и единственное, что связано с этим, - это то, что вы используете или вещи, которые вам нужны. – cHao

ответ

0

Я думаю, вам нужен API более низкого уровня для управления памятью. Тогда этот question может вам помочь.

Предлагается mmap функция. Надеюсь, это поможет вам.

+3

Почти 84k rep, более 60k его в тегах C и C++. Я уверен, что он знает, как связать (или не ссылку). – cHao

+0

Вы правы, но где вы знаете, что он не программирует под окнами раньше и теперь хочет перейти на linux? – demonking

0

Согласно ldd Следующие библиотеки связаны по умолчанию с g ++ 4.8 на моей машине Linux Ubuntu для базовых программ на C++.

linux-vdso.so.1 => (0x00007fffe11fe000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f1d1e49b000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f1d1e285000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1d1debc000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1d1dbb8000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f1d1e7c7000) 

Вы можете отключить связь их с помощью -nodefaultlibs переключателя, но вы также должны указать, что они должны быть связаны позже с помощью соответствующих переключателей.

1

По умолчанию G ++ в Linux будет ссылаться на стандартную библиотеку C и стандартную библиотеку C++. Иногда он также автоматически вводит математическую библиотеку, хотя исторически вам нужно задать это с помощью -lm.

На моем окне Ubuntu, я скомпилирован и связан следующий простой «Hello World» приложение:

#include <iostream> 

int main() 
{ 
    std::cout << "Hello world!" << std::endl; 
} 

Я скомпилированный его следующим образом: g++ hello.cpp

Утилита ldd перечисляет библиотеки g++ связаны это против :

$ ldd a.out 
linux-vdso.so.1 => (0x00007fff1d344000) 
libstdc++.so.6 => /usr/local/lib64/libstdc++.so.6 (0x00007fd7fb031000) 
libm.so.6 => /lib/libm.so.6 (0x00007fd7fadae000) 
libgcc_s.so.1 => /usr/local/lib64/libgcc_s.so.1 (0x00007fd7fab97000) 
libc.so.6 => /lib/libc.so.6 (0x00007fd7fa813000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fd7fb365000) 

Первая строка, linux-vdso.so.1 на самом деле не является библиотекой. Google, если вы хотите узнать о каком-то волшебном хаке. Остальная довольно пешеход:

  • libstdc++ является C++ стандартной библиотеки
  • libm является вышеупомянутой математической библиотекой. Я не знаю, добавляет ли C++ по умолчанию, но исторически компилятор C не включал его, если вы не указали -lm во время соединения.
  • libgcc_s является GCC конкретной библиотеки поддержки, содержащим различные процедуры поддержки (то есть. Для странных вещей, как чудные делит, структуру-копий и т.д.)
  • libc является стандартной библиотекой С. Он также содержит много функций POSIX.
  • ld-linux-x86-64 является загрузчиком динамической библиотеки. Это фактически исполняемый файл.

Итак, это набор компонентов по умолчанию.

Pieces, такие как malloc, new, printf и т. Д. Все там, вместе с полной стандартной библиотекой C++ (что некоторые называют «STL»).

Если вы спрашиваете, какая поддержка предоставляется по умолчанию, это она. Если вы пытаетесь реализовать свои собственные версии этих вещей, флаг -nodefaultlibs позволит вам. Вам также может понадобиться -ffreestanding и, возможно, даже -fno-builtins.

Если вы хотите увидеть, как эти части построены (в том числе, как Glibc называет mmap и/или sbrk, чтобы получить память для заполнения malloc кучи), вы можете загрузить исходный код для Glibc и посмотрим. Существует не уровень ниже glibc, на который вы можете настроить таргетинг напрямую, кроме системных вызовов напрямую.

Предполагая, что вы создаете свой код с помощью GCC/G ++, вам может потребоваться включить некоторые из этих библиотек, такие как libgcc_s и libstdc++. Возможно, вы сможете ограничить/устранить свою зависимость от libstdc++, если вы воздерживаетесь от использования стандартных библиотечных функций и создаете с помощью -ffreestanding. Но, я буду честен: я знаю только флаг, я никогда не использовал его.

+0

Прошу прощения, но это то, о чем вы просите? – felknight

+0

Почему вы не компилируете и не связываете это: 'int main() {}' и посмотреть, что действительно необходимо? В вашем коде вы используете iostream, и это может привести к некоторым зависимостям. –

+0

Просто для справки, хотя стандарт говорит, что он должен, '-ffreestanding' не хорошо играл с исключениями для меня; вещи будут ломаться, если я не отключу исключения. Я беру это обратно ... он * мог бы * работать, но мне пришлось бы включать функции, которые взломали, как внутренние элементы исключения среды выполнения. – cHao

0

В Linux glibc эквивалентен многим материалам в библиотеках Windows. Функции интерфейса POSIX C, включая стандартную библиотеку C, а также оболочку системных вызовов ядра, находятся в libc. Это основной слой оболочки, обеспечивающий совместимость ABI между различными версиями ядра. Не использовать его очень глупо.

Windows CRT действительно имеет другой статус, поскольку POSIX имеет другой статус в Windows. Где Win32 API предоставляет интерфейс ОС в Windows, это POSIX (включая C stdlib!) В Linux.

Когда на Linux, ссылка glibc.

Вам также потребуется связать некоторую библиотеку поддержки компилятора, будь то компилятор LLVM-rt или GCC libgcc.

Смежные вопросы