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

С++ под Linux

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

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

15.01.2017, 01:52. Просмотров 377. Ответов 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
все работает как положено.
Что я делаю не так? И как делать правильно?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2017, 01:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сборка динамической библиотеки (C++ Linux):

Создание динамической библиотеки - C++ Linux
есть makefile root_include_dir :=include root_source_dir:=src source_subdirs :=./cRand ./fft ./rs compile_flags :=-Wall -pipe ...

Не видит содержимое динамической библиотеки - C++ Linux
(clang, linux) Делаю так: 1. Компиляция объектов 2. Сборка в динамическу библиотеку 3. Расположение её в /usr/local/lib (чтобы не...

Создание динамической библиотеки для СУБД Oracle - C++ Linux
Добрый день. У Субд Оракл есть технология подключения сторонних программ (например на с или с++). Подключаются они к базе в виде...

Сборка библиотеки pHash - C++
Всем привет! Возникла необходимость воспользоваться библиотекой pHash . Нужна она для вычисления хэшей изображений, аудио или видео. В...

Сборка библиотеки и ошибка "fatal error LNK1149: имя выходного файла совпадает с именем входного файла" - C++
при сборке библиотеки возникает такая ошибка LINK : fatal error LNK1149: имя выходного файла совпадает с именем входного файла, объясните...

одкладка динамической памяти - C++ Linux
Привет всем! какой код нужно написать для динамической одкладки ? пользуюсь eclipse...пробывал такой код откомпилировать FILE*...

8
nimazzzy
Заблокирован
15.01.2017, 02:27 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ampermetr Посмотреть сообщение
Что я делаю не так?
Запускаешь шареную библиотеку.
Цитата Сообщение от ampermetr Посмотреть сообщение
И как делать правильно?
С ней нужно линковаться основной программе (либо загружать динамически) и вызывать функции.
0
ampermetr
22 / 22 / 8
Регистрация: 01.05.2015
Сообщений: 173
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"))
0
nimazzzy
Заблокирован
15.01.2017, 12:03 #4
Цитата Сообщение от ampermetr Посмотреть сообщение
из питона я как раз вызываю функцию
Хорошо. Но функция у тебя принимает число и адрес массива указателей на строки. А передаешь ты ей два указателя на строки. Ничего не не смущает?
При запуске программы, тем, чтобы передать аргументы командной строки и их кол-во в main занимается сишный рантайм. Библиотека не приложение, ей никто заполнять эти данные и передавать в каждую функцию не будет.
0
ampermetr
22 / 22 / 8
Регистрация: 01.05.2015
Сообщений: 173
15.01.2017, 14:09  [ТС] #5
Вроде разобрался) надо было переименовать main во что нибудь другое и передавать int без заморочек.
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
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))
1
ampermetr
22 / 22 / 8
Регистрация: 01.05.2015
Сообщений: 173
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;
}
возвращает одно значение, причем иногда и отрицательное, думаю проблема в области видимости переменных и функция возвращает мусор
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
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 содержит мусор
}
1
Evg
Эксперт CАвтор FAQ
17944 / 6175 / 411
Регистрация: 30.03.2009
Сообщений: 16,952
Записей в блоге: 27
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
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2017, 10:11
Привет! Вот еще темы с ответами:

Инспектор динамической памяти процессов - C++
Здравствуйте! Помогите пожалуйста. Нужно сделать &quot;Инспектор динамической памяти процессов&quot;. Может у кого-нибудь есть что-нибудь?

Задачка с динамической памятью и вводом из файла - C++
Здраствуйте...Помогите написать любую программу с использованием динамической память и ввода из файла...на c++ версии вроде 3.1 досовский...

Порядок инициализации при динамической линкове - C++ Linux
Есть ситуация. Приложение динамически загружает шареный объект(so) с помощью posix вызовов(dlopen). В библиотеке есть 2 глобальных...

Посоветуйте, где почитать о тонкостях работы динамической памяти в linux. - C++ Linux
Ну, сам, конечно, тоже кой-что уже знаю, но... (даже то что знаю - не во всём уверен). Посоветуйте, плз, что можно почитать. (А то,...


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
16.01.2017, 10:11
Ответ Создать тему
Опции темы

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