我正在尝试获得一些旧的64位 系统的旧旧代码,而且我现在已经被卡住了。 下面是一个小型C 文件,用于测试当前正在打断的实际程序中存在的功能。#define _POSIX_SOURCE

#include

#include

#undef _POSIX_SOURCE

#include

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(" %sn", dp->d_name);

closedir(dirp);

}

}

这个问题:

操作系统是红帽 7.0 Maipo x86_64. 遗留代码是 32位,必须以这种方式保持。

我已经使用 g++的-m32 标志,得到了程序工作正常的编译。 出现的问题是在运行时,readdir() 获取一个 64位 节点,然后抛出一个 EOVERFLOW errno,当然不会打印出任何内容。

我已经尝试使用 readdir64() 代替 readdir() 来取得一些成功。 我不再获得,EOVERFLOW,而且这些行出现在终端上,但是文件本身并没有打印出来。 这是由于缓冲区不是 dirent 所期望的。

我试着使用 dirent64 来缓解这里问题,但每当我尝试这里问题时,都会尝试:test.c:19:22 error: dereferencing pointer to incomplete type

printf(" %sn", dp->d_name);

不知道是否有一种方法可以手动将 dp->d_name 缓冲区转换为来与一起使用。 在Gdb中我注意到使使用 readdir() 和 dirent 会导致 dp->d_name 中列出的目录,而 readdir64() 和 dirent 则提供了在 dp->d_name[8] 中。

或者,或者让 dirent64 工作,或者我只是在完全错误的路径上。

最后,值得注意的是,没有包含 -m32 标志的程序函数,所以我认为它必须是 32个/64 兼容错误。 感谢你的帮助。

Logo

一站式 AI 云服务平台

更多推荐