__xstat Ошибка разрешения динамического символа на 64-битной системе - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь динамически загрузить статистическую функцию, используя dlopen и dlsym.Функции из stat familly обернуты в соответствующие функции __xstat, __xstat64 itp.

Следуя фрагменту кода, компилируется и работает при компиляции в 32-битном режиме (sys/stat.h включено для получения структуры статистики радипример)

#include <iostream>
#include <dlfcn.h>
#include <sys/stat.h>

typedef int (*xstat_f) (int __ver, const char *__filename, struct stat *__stat_buf);

int main()
{
    auto* h = dlopen("libc.so.6", RTLD_LAZY);
    if(!h)
    {
        return 1; // invalid handle
    }

    auto f = (xstat_f)dlsym(h, "__xstat");
    if(!f)
    {
        return 1; // invalid handle
    }

    struct stat s = {};

    const auto r = f(3, "/tmp", &s);

    if (r != 0)
    {
        perror("stat");
        return errno;
    }

    return 0;
}

g++ main.cpp -o main -ldl -m32

Исполняемый файл, скомпилированный без переключателя -m32 на 64-битной машине, возвращает EINVAL (неверный аргумент).

В чем причина?

Также я сделал минимальный тест

#include <iostream>
#include <sys/stat.h>

int main(){
    struct stat s;
    const auto x = stat("/tmp", &s);
    if(x != 0) return errno;
    return 0;
}

и, используя objdump -T, для обоих исполняемых файлов, 32-битных и 64-битных, показывает, что stat разрешен как __xstat, поэтому яиспользуя правильный символ.Также я пробовал комбинацию __xstat/__xstat64, struct stat/stat64, тот же результат.

1 Ответ

0 голосов
/ 05 февраля 2019

__ xstat объявлений следует:

int __xstat(int ver, const char *path, (struct stat *stat_buf))

в документации параметр ver описывается как ver shall be 3 or the behavior of these functions is undefined, что не совсем верно, потому что в исходном коде определение _STAT_VER_LINUX следует:

#ifndef __x86_64__
# define _STAT_VER_LINUX    3
#else
# define _STAT_VER_LINUX    1
#endif

Вот почему __xstat вызов на 64-битном сбое, параметр ver должен был быть установлен на 1, а 3 на 32-битную компиляцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...