Я пытаюсь динамически загрузить статистическую функцию, используя 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
, тот же результат.