Форум программистов, компьютерный форум CyberForum.ru

С++ под Linux

Войти
Регистрация
Восстановить пароль
 
ampermetr
16 / 16 / 8
Регистрация: 01.05.2015
Сообщений: 162
#1

Сборка динамической библиотеки - C++ Linux

15.01.2017, 01:52. Просмотров 223. Ответов 8
Метки нет (Все метки)

Пытаюсь собрать динамическую библиотеку для использования её из питона.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <string>
#include <sys/ptrace.h>
#include <errno.h>
#include <cstdlib>
 
using namespace std;
 
int main(int argc, char* argv[])
{
pid_t pid = atoi(argv[1]);
//~ int addr = atoi(argv[2]);
int addr = 0x00329304;
int ret = ptrace(PTRACE_ATTACH, pid, NULL, NULL);
cout << "ptrace Status: " << ret << endl;
cout << "Errno: " << errno << endl;
ret = ptrace(PTRACE_PEEKDATA, pid, addr, NULL);
cout << "ptrace Status: " << ret << endl;
cout << "Errno: " << errno << endl;
int _ret = ptrace(PTRACE_DETACH, pid, NULL, NULL);
cout << "ptrace Status: " << _ret << endl;
cout << "Errno: " << errno << endl;
return ret;
}
опции сборки
C++
1
2
g++ -fPIC -c ptrace6.cpp
g++ -shared -o output.so ptrace6.o
При запуске собранной библиотеки получаю ошибку сегментирования
Если же собирать исполняемый файл с помощью
C++
1
g++ -lm -o output ptrace6.cpp
все работает как положено.
Что я делаю не так? И как делать правильно?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2017, 01:52     Сборка динамической библиотеки
Посмотрите здесь:

C++ Linux Посоветуйте, где почитать о тонкостях работы динамической памяти в linux.
C++ Linux Статическая сборка (*nix)
Создание динамической библиотеки для СУБД Oracle C++ Linux
C++ Linux Сборка программы с MPI
одкладка динамической памяти C++ Linux
Привязка библиотеки C++ Linux
Посоветуйте инструменты для профилирования и поиску ошибок в динамической памяти C++ Linux
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nimazzzy
 Аватар для nimazzzy
496 / 452 / 120
Регистрация: 29.03.2016
Сообщений: 1,440
Завершенные тесты: 1
15.01.2017, 02:27     Сборка динамической библиотеки #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ampermetr Посмотреть сообщение
Что я делаю не так?
Запускаешь шареную библиотеку.
Цитата Сообщение от ampermetr Посмотреть сообщение
И как делать правильно?
С ней нужно линковаться основной программе (либо загружать динамически) и вызывать функции.
ampermetr
16 / 16 / 8
Регистрация: 01.05.2015
Сообщений: 162
15.01.2017, 02:50  [ТС]     Сборка динамической библиотеки #3
nimazzzy, из питона я как раз вызываю функцию
Python
1
2
3
if __name__ == '__main__':
    libc = ctypes.CDLL("/mnt/disk750gb/home/user/Desktop/Arcana1/output.so")
    print(libc.main("8734", "8734"))
nimazzzy
 Аватар для nimazzzy
496 / 452 / 120
Регистрация: 29.03.2016
Сообщений: 1,440
Завершенные тесты: 1
15.01.2017, 12:03     Сборка динамической библиотеки #4
Цитата Сообщение от ampermetr Посмотреть сообщение
из питона я как раз вызываю функцию
Хорошо. Но функция у тебя принимает число и адрес массива указателей на строки. А передаешь ты ей два указателя на строки. Ничего не не смущает?
При запуске программы, тем, чтобы передать аргументы командной строки и их кол-во в main занимается сишный рантайм. Библиотека не приложение, ей никто заполнять эти данные и передавать в каждую функцию не будет.
ampermetr
16 / 16 / 8
Регистрация: 01.05.2015
Сообщений: 162
15.01.2017, 14:09  [ТС]     Сборка динамической библиотеки #5
Вроде разобрался) надо было переименовать main во что нибудь другое и передавать int без заморочек.
retmas
Жарю без масла
841 / 723 / 157
Регистрация: 13.01.2012
Сообщений: 1,667
15.01.2017, 14:53     Сборка динамической библиотеки #6
Цитата Сообщение от ampermetr Посмотреть сообщение
надо было переименовать main во что нибудь другое
хоть проблема и не в этом, но мысль здравая.
Цитата Сообщение от ampermetr Посмотреть сообщение
передавать int без заморочек.
именно, ибо проблема была в передаче параметров в вашем питон модуле.
если уж вам по какой то причине понадобится вызывать подобную С-функцию из библиотеки в питоне, то делается это примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <string.h>
 
#ifdef __cplusplus
extern "C"
#endif
int my_func(int cnt, char** str_list)
{
    int ret = 0;
    while(cnt-- > 0)
        ret += strlen(str_list[cnt]);
    return ret;
}
Python
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import ctypes
 
if __name__ == '__main__':
    libc = ctypes.CDLL("libmydll.so")
    func = libc.my_func
    argc = 2
    argv = (ctypes.c_char_p * argc)()
    argv[:] = [b'asd', b'fghjk']
    print ("Сумма длин слов: %s" % func(argc, argv))
ampermetr
16 / 16 / 8
Регистрация: 01.05.2015
Сообщений: 162
16.01.2017, 02:18  [ТС]     Сборка динамической библиотеки #7
retmas, а из питона возможно вызывать функцию, возвращающую адрес? (массив)
C++
1
2
3
4
5
6
7
8
unsigned int * qwerty(int i, int x, int y)
{
...
...
unsigned int coords[2] = {retX, retY};
 
return coords;
}
возвращает одно значение, причем иногда и отрицательное, думаю проблема в области видимости переменных и функция возвращает мусор
retmas
Жарю без масла
841 / 723 / 157
Регистрация: 13.01.2012
Сообщений: 1,667
16.01.2017, 08:56     Сборка динамической библиотеки #8
вызвать можно, но вернет она, как вы и сказали мусор. и не важно, из питона или откуда либо еще. она вернет мусор даже при вызове ее в той же библиотеке, так как время жизни вашего автоматического массива, созданного на стеке, ограничено областью видимости( в теле функции).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
unsigned int* qwerty(int i, int x, int y)
{
    ...
    unsigned int coords[2] = {retX, retY};
 
    return coords;
}
 
void fn()
{
    unsigned int* arr = qwerty(1, 2, 3);
    // arr содержит мусор
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2017, 10:11     Сборка динамической библиотеки
Еще ссылки по теме:

C++ Linux Создание динамической библиотеки
C++ Linux Порядок инициализации при динамической линкове
C++ Linux Не видит содержимое динамической библиотеки
Подключение библиотеки Qt C++ Linux
Сборка gmp C++ Linux

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17184 / 5438 / 337
Регистрация: 30.03.2009
Сообщений: 14,742
Записей в блоге: 26
16.01.2017, 10:11     Сборка динамической библиотеки #9
Цитата Сообщение от ampermetr Посмотреть сообщение
И как делать правильно?
Динамическая библиотека собирается так:

Код
$ g++ -fPIC t1.cpp -o t1.o
$ g++ -fPIC t2.cpp -o t2.o
$ g++ -fPIC t3.cpp -o t3.o
$ g++ -shared t1.o t2.o t3.o -o libtrampampam.so
ну или всё это же самое в одну строку

Код
$ g++ -fPIC -shared t1.cpp t2.cpp t3.cpp -o libtrampampam.so
Yandex
Объявления
16.01.2017, 10:11     Сборка динамической библиотеки
Ответ Создать тему
Опции темы

Текущее время: 10:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru