The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"ошибка определения переменной RTLD_NEXT "
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"ошибка определения переменной RTLD_NEXT "  +/
Сообщение от Семн email on 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

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "дефайна не хватает"  +/
Сообщение от Вова on 13-Май-11, 09:16 
а ты посмотри dlfcn.h  
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "дефайна не хватает"  +/
Сообщение от Semensemen email(ok) on 13-Май-11, 13:15 
> а ты посмотри dlfcn.h

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


Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

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

а выше?

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "дефайна не хватает"  +/
Сообщение от Semensemen email(ok) on 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)

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


Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "дефайна не хватает"  +/
Сообщение от Вова on 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 присутствует, всё в порядке.

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "дефайна не хватает"  +/
Сообщение от Semensemen email(ok) on 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 присутствует, всё в порядке.

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


Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "дефайна не хватает"  +/
Сообщение от Вова on 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 выше включения этого файла. Я, в свою очередь, не понимаю, что тут можно не понимать?

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "дефайна не хватает"  +/
Сообщение от Semensemen email(ok) on 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, а тут-то в чём дело?

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

9. "дефайна не хватает"  +/
Сообщение от Вова on 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 - задавайте этот обобщенный дефайн.

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

10. "дефайна не хватает"  +/
Сообщение от Semensemen email(ok) on 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 - задавайте этот обобщенный дефайн.

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


Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

11. "дефайна не хватает"  +/
Сообщение от Вова on 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  показывает список определений. Вобщем - в кампах надо шарить, Семён.

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

12. "дефайна не хватает"  +/
Сообщение от Semensemen email(ok) on 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  показывает список
> определений. Вобщем - в кампах надо шарить, Семён.

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

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру