PKF*_*yah 6 c 32-bit file dirent.h
我正试图让一些旧的遗留代码在新的64位系统上运行,而且我现在卡住了.下面是一个小C文件,我用它来测试当前正在破坏的实际程序中存在的功能.
#define _POSIX_SOURCE
#include <dirent.h>
#include <sys/types.h>
#undef _POSIX_SOURCE
#include <stdio.h>
main(){
DIR *dirp;
struct dirent *dp;
char *const_dir;
const_dir = "/any/path/goes/here";
if(!(dirp = opendir(const_dir)))
perror("opendir() error");
else{
puts("contents of path:");
while(dp = readdir(dirp))
printf(" %s\n", dp->d_name);
closedir(dirp);
}
}
Run Code Online (Sandbox Code Playgroud)
问题:
操作系统是Red Hat 7.0 Maipo x86_64.遗留代码是32位,必须保持这种方式.
我已经使用-m32带有标志的程序正常编译g++.出现的问题是在运行时,readdir()得到一个64位的inode,然后抛出一个EOVERFLOW错误,当然没有打印出来.
我试过用readdir64()它代替取得readdir()了一些成功.我不再获得errno EOVERFLOW,并且终端上出现了线条,但文件本身不会被打印出来.我假设这是由于缓冲区不是dirent预期的.
我试图用来dirent64试图缓解这个问题,但每当我尝试这个时,我得到:
test.c:19:22 error: dereferencing pointer to incomplete type
printf(" %s\n", dp->d_name);
Run Code Online (Sandbox Code Playgroud)
我想知道是否有办法手动移动dp->d_name缓冲区dirent以供使用readdir().我在GDB注意到,使用readdir()和dirent在结果dp->d_name具有列出的目录dp->d_name[1],而readdir64()和dirent给人的第一目录中dp->d_name[8].
那或者以某种方式开始dirent64工作,或者我可能完全走错了路.
最后,值得注意的是程序在没有-m32包含标志的情况下完美运行,所以我假设它必须是某个地方的32/64兼容性错误.任何帮助表示赞赏.
感谢上面评论中的@Martin,我被引导尝试在我的代码中定义 dirent64 结构。这有效。可能有一个 #define 可用于避免将 libc .h 代码粘贴到我自己的代码中,但这目前有效。
我需要的代码可以在<bits/dirent.h>中找到
我想我还应该注意到,这使得它可以同时使用 readdir64() 和 dirent64