хочу переопределить функции чтения данных из сокета, для чего создаю подгружаемую библиотеку .so, но она не создаётся из-за ошибки.
при компиляции данного кода ( командой gcc -fPIC -c -Wall dll.c ) у меня ошибка:
dll.c: In function 'init_wrappers' :
dll.c:91 'RTLD_NEXT' undeclared (first use in this function)
dll.c:91 (Each undeclared identifier is reported only once
dll.c:91 for each function it appears in.)#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <dlfcn.h>
#include <stdio.h>
int j;
ssize_t (*_recvmsg)(int sockfd, struct msghdr *msg, int flags);
ssize_t (*_recvfrom)(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t (*_recv)(int sockfd, void *buf, size_t len, int flags);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags)
{
ssize_t error;
char* data;
error = _recvmsg(sockfd, msg, flags);
if (error > 0)
{
size_t i;
struct iovec *iovec;
for (i = 0; i < msg->msg_iovlen; ++i)
{
iovec = &msg->msg_iov[i];
data = iovec->iov_base ;
for (j = 0; j < iovec->iov_len ; j++)
{
if (data[i]=='l')
if (data[i+1]=='p')
if (data[i+2]=='a')
if (data[i+3]=='d')
{ errno = EPERM ; error = -1 ;}
}
}
}
return error;
}
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)
{
ssize_t error;
char* data;
data = buf ;
error = _recvfrom(sockfd, buf, len, flags, src_addr, addrlen);
if ( error > 0 )
for ( j = 0 ; j < len ; j++ )
{
if (data[i]=='l')
if (data[i+1]=='p')
if (data[i+2]=='a')
if (data[i+3]=='d')
{ errno = EPERM ; error = -1 ;}
}
return error;
}
ssize_t recv(int sockfd, void *buf, size_t len, int flags)
{
ssize_t error;
char* data;
data = buf ;
error = _recv(sockfd, buf, len, flags);
if ( error > 0 )
for ( j = 0 ; j < len ; j++ )
{
if (data[i]=='l')
if (data[i+1]=='p')
if (data[i+2]=='a')
if (data[i+3]=='d')
{ errno = EPERM ; error = -1 ;}
}
return error;
}
int init_wrappers()
{
void *ptr;
if ((ptr = dlsym(RTLD_NEXT, "recvmsg")) == NULL)
{
fprintf(stderr, "dlsym() 1 failed");
return -1;
}
_recvmsg = ptr;
if ((ptr = dlsym(RTLD_NEXT, "recvfrom")) == NULL)
{
fprintf(stderr, "dlsym() 2 failed");
return -1;
}
_recvfrom = ptr;
if ((ptr = dlsym(RTLD_NEXT, "recv")) == NULL)
{
fprintf(stderr, "dlsym() 3 failed");
return -1;
}
_recv = ptr;
return 0;
}
__attribute__((constructor))
void init()
{
if (init_wrappers())
{
exit(-1);
}
}вроде необходимая библиотека подключена, почему он не видит RTLD_NEXT
а ты посмотри dlfcn.h
> а ты посмотри dlfcn.hтам есть:
#define RTLD_NEXT ((void*)-1l)
>> а ты посмотри dlfcn.h
> там есть:
> #define RTLD_NEXT ((void*)-1l)а выше?
>>> а ты посмотри dlfcn.h
>> там есть:
>> #define RTLD_NEXT ((void*)-1l)
> а выше?выше только:
#ifndef _DLFCN_H
#define _DLFCN_H 1#include <features.h>
#define __need_size_t
#include <stddef.h>#include <bits/dlfcn.h>
#ifdef __USE_GNU
#define RTLD_NEXT ((void*)-1l)
и всё. А что тут должно быть?
>[оверквотинг удален]
> выше только:
> #ifndef _DLFCN_H
> #define _DLFCN_H 1
> #include <features.h>
> #define __need_size_t
> #include <stddef.h>
> #include <bits/dlfcn.h>
> #ifdef __USE_GNU
> #define RTLD_NEXT ((void*)-1l)
> и всё. А что тут должно быть?Да всё есть. ifdef __USE_GNU присутствует, всё в порядке.
>[оверквотинг удален]
>> #ifndef _DLFCN_H
>> #define _DLFCN_H 1
>> #include <features.h>
>> #define __need_size_t
>> #include <stddef.h>
>> #include <bits/dlfcn.h>
>> #ifdef __USE_GNU
>> #define RTLD_NEXT ((void*)-1l)
>> и всё. А что тут должно быть?
> Да всё есть. ifdef __USE_GNU присутствует, всё в порядке.Может, конечно, я чего-то не понимаю! Ну а что мне в итоге в своей программе поменять?
>[оверквотинг удален]
>>> #include <features.h>
>>> #define __need_size_t
>>> #include <stddef.h>
>>> #include <bits/dlfcn.h>
>>> #ifdef __USE_GNU
>>> #define RTLD_NEXT ((void*)-1l)
>>> и всё. А что тут должно быть?
>> Да всё есть. ifdef __USE_GNU присутствует, всё в порядке.
> Может, конечно, я чего-то не понимаю! Ну а что мне в итоге
> в своей программе поменять?надо добавить дефайн __USE_GNU выше включения этого файла. Я, в свою очередь, не понимаю, что тут можно не понимать?
>[оверквотинг удален]
>>>> #include <stddef.h>
>>>> #include <bits/dlfcn.h>
>>>> #ifdef __USE_GNU
>>>> #define RTLD_NEXT ((void*)-1l)
>>>> и всё. А что тут должно быть?
>>> Да всё есть. ifdef __USE_GNU присутствует, всё в порядке.
>> Может, конечно, я чего-то не понимаю! Ну а что мне в итоге
>> в своей программе поменять?
> надо добавить дефайн __USE_GNU выше включения этого файла. Я, в свою очередь,
> не понимаю, что тут можно не понимать?Виноват! Не разобрался с дерективами препроцессора, просто всегда программировал на
C++ и проблем с дерективами ну уж точно не было ни разу.
Зато теперь у меня вылезла другая ошибка:
In file included from dll.c: 6:
/usr/include/stdio.h:281: parse error before '_IO_cookie_io_function_t'
там, вроде тоже стоит #ifdef __USE_GNU, а тут-то в чём дело?
>[оверквотинг удален]
>>> в своей программе поменять?
>> надо добавить дефайн __USE_GNU выше включения этого файла. Я, в свою очередь,
>> не понимаю, что тут можно не понимать?
> Виноват! Не разобрался с дерективами препроцессора, просто всегда программировал на
> C++ и проблем с дерективами ну уж точно не было ни
> разу.
> Зато теперь у меня вылезла другая ошибка:
> In file included from dll.c: 6:
> /usr/include/stdio.h:281: parse error before '_IO_cookie_io_function_t'
> там, вроде тоже стоит #ifdef __USE_GNU, а тут-то в чём дело?Проблема абсолютно такая же. Есть дефайн - обобщение для всех гну-исходников, надо использовать его вместо __USE_GNU и __USE_GNU_SOURCE и подобных. Не хватило _USE_GNU - задавайте этот обобщенный дефайн.
>[оверквотинг удален]
>> Виноват! Не разобрался с дерективами препроцессора, просто всегда программировал на
>> C++ и проблем с дерективами ну уж точно не было ни
>> разу.
>> Зато теперь у меня вылезла другая ошибка:
>> In file included from dll.c: 6:
>> /usr/include/stdio.h:281: parse error before '_IO_cookie_io_function_t'
>> там, вроде тоже стоит #ifdef __USE_GNU, а тут-то в чём дело?
> Проблема абсолютно такая же. Есть дефайн - обобщение для всех гну-исходников, надо
> использовать его вместо __USE_GNU и __USE_GNU_SOURCE и подобных. Не хватило
> _USE_GNU - задавайте этот обобщенный дефайн.А как можно понять, что это именно он? Как его найти?
>[оверквотинг удален]
>>> C++ и проблем с дерективами ну уж точно не было ни
>>> разу.
>>> Зато теперь у меня вылезла другая ошибка:
>>> In file included from dll.c: 6:
>>> /usr/include/stdio.h:281: parse error before '_IO_cookie_io_function_t'
>>> там, вроде тоже стоит #ifdef __USE_GNU, а тут-то в чём дело?
>> Проблема абсолютно такая же. Есть дефайн - обобщение для всех гну-исходников, надо
>> использовать его вместо __USE_GNU и __USE_GNU_SOURCE и подобных. Не хватило
>> _USE_GNU - задавайте этот обобщенный дефайн.
> А как можно понять, что это именно он? Как его найти?используйте редактор с поддержкой тагов, в виме g ctrl+5 показывает список определений. Вобщем - в кампах надо шарить, Семён.
>[оверквотинг удален]
>>>> Зато теперь у меня вылезла другая ошибка:
>>>> In file included from dll.c: 6:
>>>> /usr/include/stdio.h:281: parse error before '_IO_cookie_io_function_t'
>>>> там, вроде тоже стоит #ifdef __USE_GNU, а тут-то в чём дело?
>>> Проблема абсолютно такая же. Есть дефайн - обобщение для всех гну-исходников, надо
>>> использовать его вместо __USE_GNU и __USE_GNU_SOURCE и подобных. Не хватило
>>> _USE_GNU - задавайте этот обобщенный дефайн.
>> А как можно понять, что это именно он? Как его найти?
> используйте редактор с поддержкой тагов, в виме g ctrl+5 показывает список
> определений. Вобщем - в кампах надо шарить, Семён.ну хоть на этом спасибо! надо же с чего-то начинать