URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9128
[ Назад ]

Исходное сообщение
"ошибка определения переменной RTLD_NEXT "

Отправлено Семн , 12-Май-11 20:13 
хочу переопределить функции чтения данных из сокета, для чего создаю подгружаемую библиотеку .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


Содержание

Сообщения в этом обсуждении
"дефайна не хватает"
Отправлено Вова , 13-Май-11 09:16 
а ты посмотри dlfcn.h  

"дефайна не хватает"
Отправлено Semensemen , 13-Май-11 13:15 
> а ты посмотри dlfcn.h

там есть:
#define RTLD_NEXT ((void*)-1l)



"дефайна не хватает"
Отправлено Вова , 13-Май-11 14:56 
>> а ты посмотри dlfcn.h
> там есть:
> #define RTLD_NEXT ((void*)-1l)

а выше?


"дефайна не хватает"
Отправлено Semensemen , 13-Май-11 16:13 
>>> а ты посмотри 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)

и всё. А что тут должно быть?



"дефайна не хватает"
Отправлено Вова , 13-Май-11 16:26 
>[оверквотинг удален]
> выше только:
> #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 присутствует, всё в порядке.


"дефайна не хватает"
Отправлено Semensemen , 13-Май-11 16:29 
>[оверквотинг удален]
>> #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 присутствует, всё в порядке.

Может, конечно, я чего-то не понимаю! Ну а что мне в итоге в своей программе поменять?



"дефайна не хватает"
Отправлено Вова , 13-Май-11 18:21 
>[оверквотинг удален]
>>> #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 выше включения этого файла. Я, в свою очередь, не понимаю, что тут можно не понимать?


"дефайна не хватает"
Отправлено Semensemen , 13-Май-11 20:01 
>[оверквотинг удален]
>>>> #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, а тут-то в чём дело?


"дефайна не хватает"
Отправлено Вова , 16-Май-11 10:36 
>[оверквотинг удален]
>>> в своей программе поменять?
>> надо добавить дефайн __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 - задавайте этот обобщенный дефайн.


"дефайна не хватает"
Отправлено Semensemen , 17-Май-11 10:01 
>[оверквотинг удален]
>> Виноват! Не разобрался с дерективами препроцессора, просто всегда программировал на
>>  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 - задавайте этот обобщенный дефайн.

А как можно понять, что это именно он? Как его найти?



"дефайна не хватает"
Отправлено Вова , 17-Май-11 10:38 
>[оверквотинг удален]
>>>  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  показывает список определений. Вобщем - в кампах надо шарить, Семён.


"дефайна не хватает"
Отправлено Semensemen , 17-Май-11 19:26 
>[оверквотинг удален]
>>>> Зато теперь у меня вылезла другая ошибка:
>>>> 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  показывает список
> определений. Вобщем - в кампах надо шарить, Семён.

ну хоть на этом спасибо! надо же с чего-то начинать