@ProCxx

Страница 89 из 2477
Andrei
16.04.2016
23:21:35
В этом файле есть функция с сигнатурой int foo(void)

Ned Ogl
16.04.2016
23:21:42
ну имя, адрес и параметры, что логично

Andrei
16.04.2016
23:21:52
И тода линкер прросматривая по порядку объектник. Её найдет

Да. Имя.

Google
Andrei
16.04.2016
23:22:01
Но это на си

На си++ эта функция в таблице экспорта будет называться как то типа ifoo@2(void)

Или еще кака-то такая хрень

А если она лежит внутри неймспейса то еще и имя неймспейса

А бедный компилятор искал foo

Вот эта хрень которая добавляется к имени функции в плюсах это называется mangling

Поэтому между двух плюсовых файлов линковщик ищет функции с mangled именами

Но если ты хочешь к плюсовому файлу прилинковать сишный

Тебе надо сообщить линковщику, что чувак, ищи не ifoo@2 а ищи _foo

Потому что это линковка с сишным объектником.

Об этом "С" и говорит после слова "extern"

Как тут правильно еще заметили есть такая вещь как ABI это совместимость на бинарном уровне(application binary interface)

Здесь речь просто о том что на разных платформах и разных реализациях компиляторов и между ними И так далее есть разные соглашения о том как передавать параметры в функцию в каком порядке как возвращать результат и куча тонкостей еще

Google
Andrei
16.04.2016
23:27:12
Чтобы ты мог прилинковать одну функцию в другую тебе надо сделать это правильно. В соответсвии с ABI

В общем внутри плюсов или внутри сишки или внутри чего еще угодно это делается само

Но между разными языками надо быть осторожным.

В общем ты напрмер можешь прилинковать в сишную программу и функцию из паскаля

Сергей
16.04.2016
23:28:53
В паскале fastcall, вроде

Andrei
16.04.2016
23:28:58
Но в паскале другой calling conventions, т е то очем выше гвоорил порядок передачи пргументов и прочее. И чтобы линкер и компилятор не проебались надо писать вот такие вещи

Сергей
16.04.2016
23:29:02
А в си cdecl

Andrei
16.04.2016
23:29:12
В паскале __pascal :D

Сергей
16.04.2016
23:29:24
A lol

Andrei
16.04.2016
23:29:27
Хотя не очень актуально в 2016 году.

Ned Ogl
16.04.2016
23:29:55
кхм

ты неплохо объясняешь

а что ещё можно сказать в виде extern X {...}

?

Andrei
16.04.2016
23:32:20
Кажется ничего кроме "C" который обслуживает си и ассемблер и "C++" который обслуживает плюсы нет

В стандарте

Но в некоторых компиляторах я знаю есть extern "Pascal" и extern "COM+"

Ned Ogl
16.04.2016
23:32:52


окай

понял

Google
Ned Ogl
16.04.2016
23:33:20
чтож, огромное спасибо

а ещё такой вот вопрос

если у нас хедеры хранятся в линуксе преимущественно в /usr/include, то где хранятся их объектники и откуда линкер знает, что откуда с чем линковать?

Stanislav
16.04.2016
23:35:04
обычно все объектники объединены в .lib файлы (.a, .la в линкусе)

Andrei
16.04.2016
23:35:32
Ага. И хранятся по большей части в /usr/lib

Ned Ogl
16.04.2016
23:35:43
как понять "объединены"?

Andrei
16.04.2016
23:35:57
А линкер знает это потому что у нег есть системная переменная ld_path

Или как-то так.

Ned Ogl
16.04.2016
23:36:16
в окружении такой нету

Andrei
16.04.2016
23:36:31
LDLIBRARYPATH

С подчеркиваниями

По-моему. Я не линуксоид могу ошибаться.

Ned Ogl
16.04.2016
23:37:04
хорошо

теперь ясно

Andrei
16.04.2016
23:37:18
Объединены в том смысле что они скомпонованы в библиотеку.

То есть просто представь как если бы ты собирал свою программу, но без main

Ned Ogl
16.04.2016
23:37:45
ну да, я понял

gcc -c

Andrei
16.04.2016
23:38:05
Это просто скомпилированные и слинкованные между собой функции которые экспортируются наружу.

Ned Ogl
16.04.2016
23:38:11
да, без компоновки

Google
Stanislav
16.04.2016
23:38:19
не совсем, LD_LIBRARY_PATH указывает где искать .so файлы

уже при запуске программы

Andrei
16.04.2016
23:38:52
Ну, справедливости ради там есть компоновка кое-какая, но не полная. Там компоновка ровно та, которую можно статически провести.

Да, вот Станислав меня поправит.

Ned Ogl
16.04.2016
23:39:03
а кто мне скажет, правильно ли я понимаю, что .so линкуются в runtime, а объектники библиотек нужны для статической линковки

так жи?

Andrei
16.04.2016
23:40:18
@crackedmind в линуксах статические либы резолвятся как-то иначе?

так жи?
Типа того.

То что взято было из ститеской либы навсегда остается в программе

А динамическая линковка берет код в рантайме.

Admin
ERROR: S client not available

Ned Ogl
16.04.2016
23:41:35
то есть чтобы написать либу, я должен сделать сначала cpp с описанием функций, затем .h с их объявлениями, затем скомпилить в объектник и положить куда надо и затем сделать .so и положить куда надо. верно?

Andrei
16.04.2016
23:42:12
Достаточно будет только .h и .so

so уже в себе содержит все из объектника.

Ned Ogl
16.04.2016
23:43:10
ну.... тогда программы, использующие либу попадают в зависимость. или можно сказать gcc —static и он прилинкует код нужных функций из .so статически?

Andrei
16.04.2016
23:43:54
Но вообще можно даже обойтись только одним .so потому что в нем есть список экспорта. Но там могут быть проблемы с пользовательскимии типами. Не забивай голову. В общем случае да .h и либа

Ох. Я вот кстати не знаю можно ли так делать.

Кажется нет.

Да. Скорее всего нельзя.

Google
Stanislav
16.04.2016
23:44:49
нет, в любом случае нужен статическая либа

Ned Ogl
16.04.2016
23:45:02
просто если пишешь для железяки, то надо, чтобы вся прога была одним бинарником который закидывается ей в память. без либ и извратов.

нет, в любом случае нужен статическая либа
то есть в итоге надо иметь .h, .o и .so?

Stanislav
16.04.2016
23:45:46
.h, .a & .so :) так точнее

Andrei
16.04.2016
23:45:48
нет, в любом случае нужен статическая либа
Ну в теории я знаю как на винде извращнуться и статически прилинковать динамический код.

Stanislav
16.04.2016
23:46:05
причем .a для шареда и для статической линковки отличаются

Andrei
16.04.2016
23:46:49
Смотри ned. Там просто дело в том, что нужен код, который динамическую библиотеку подгрузит

Ned Ogl
16.04.2016
23:47:10
если ты собираешься зависеть от либы и линковать её динамически во время runtime, нужно ли в коде напрямую делать dlopen()?

Andrei
16.04.2016
23:47:13
И вот он то и находится в статической либе, которая нужна чтобы использовать динамическую.

Ned Ogl
16.04.2016
23:47:32
а, ну я вот как раз за этот код и спрашиваю

Andrei
16.04.2016
23:47:54
Вот. Можно либо так да, либо когда делаешь свою шареную либу еще делать к ней маленький статический лоадер

Ned Ogl
16.04.2016
23:48:01
то есть, если будешь зависеть от .so, тебе нужно сначала его dlopen() а потом использовать функции?

понял

все

Andrei
16.04.2016
23:48:07
Вернее за тебя это сейчас компиляторы делабт.

Ned Ogl
16.04.2016
23:48:42
ну да, ведь libstdc++ тоже по идее .so, но явно я её не подгружаю

Andrei
16.04.2016
23:48:50
Угу.

Ned Ogl
16.04.2016
23:48:58
вроде бы и qt не подгружают явно

хорошо

что будет, если скачать из винды noname.dll и сделать во время runtime с ней dlopen?

Andrei
16.04.2016
23:49:35
Это делает код внутри статических либ, который вот кстати как раз вызывается перед main

Ned Ogl
16.04.2016
23:49:37
архитектура та же, API не затрагивается

Andrei
16.04.2016
23:49:52
Разные abi ничего не выйдет

Страница 89 из 2477