LINUX.ORG.RU

Написание модуля на C++


0

0

Помогите с сылками на сабж - а то очень сильно нужно научиться написать модули, которые можно было бы подгружать в процессе исполнения.

Спасибо.

Utandr@e-mail.ru


man dlopen

Только учти что в бинарниках C++ имена функций отличаются от того как ты их объявлял. Проще всего это можно обойти имея функцию на Си которая регистрирует загружаемый модуль в твоей программе нужным образом.

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


2anonymous (*) (2002-04-10 14:26:00.0):
> имея функцию на Си которая регистрирует загружаемый модуль в твоей программе нужным
> образом.

Отсюда можно подробнее? AFAIK из Сшной проги нелзя вызвать С++ную,
и динамическая линковка С++ных либ возможно ТОЛЬКО с C++ми прогами, откомпиленными тем
же компилером.

Die-Hard ★★★★★
()

Ты меня не так понял.  Поясню на примере:

extern "C" {
    int test(int aaa);
}

int test(int aaa)
{
    return aaa / 5;
}

int main(int argc, char *argv[])
{
    return test(10);
}

Если посмотреть символы в бинарнике (командо nm, например), то функция "test" будет называться как ей полагается - "test".  Убери объявление прототипа через extern "C" и функция "test" превратится в "test__Fi".

anonymous
()

что значит - нельзя. Собственными руками делал. Надо просто любым текстовым редактором подправить обьектный файл и все. :) например функцию int f(int x) C++ назовет в обьектнике f__Fi . C назовет ее просто f. Делаем так. В сишном модуле обьявляем fHLAM, потом компиляем и заменяем в обьектнике HLAM на __Fi. После этого все собирается на ура. Тут конечно можно и сразу назвать ее f__Fi - но так не проканает в фортрановском модуле, так как фортран добавляет в каждому имени _

SadStork
()

:) Править объектные файлы руками - это круто. Так или иначе проблема с именами обходится легко, а проблема с разными компиляторами остается. Когда есть необходимость обеспечить работу плагинов собранных разными компиляторами С++ противопоказан.

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

2anonymous (*) (2002-04-11 04:21:04.0):
Ок, теперь понял -

> extern "C" {
> int test(int aaa);
> }
>
> int test(int aaa)
> {
> return aaa / 5;
> }


Если функция main была в С++ной программе, то проканает.

Die-Hard ★★★★★
()
Ответ на: комментарий от SadStork

SadStork (*) (2002-04-11 07:58:52.0):
> любым текстовым редактором подправить обьектный файл
Попробуй, откомпили модуль с функцией int f123456HLAM(int x) с помощью cxx на
True64, а потом поищи в объектнике HLAM.

Кстати, nm покажет 'f123456HLAM(int)'.

Интересно, что с f такой номер проканает, имя короткое, в объектнике
будет нечто типа f__XiprОint

Die-Hard ★★★★★
()

2 SadStork:

Яхуею, дорогая редакция. Не перевелись еще богатыри на Руси!

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