새로운 64 비트 시스템에서 작동하는 오래된 레거시 코드를 얻으려고하고 있습니다. 현재 멈추었습니다. 아래는 현재 깨고있는 실제 프로그램에 존재하는 기능을 테스트하기 위해 사용하는 작은 C 파일입니다.readdir() 32/64 호환성 문제
#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);
}
}
문제점 :
OS는 레드햇 7.0 Maipo의 x86_64에 있습니다. 레거시 코드는 32 비트이므로 이러한 방식으로 유지해야합니다.
-m32
플래그를 사용하여 g++
과 함께 작동하는 프로그램의 컴파일을 얻었습니다. 발생하는 문제는 런타임 중에 발생합니다. readdir()
은 64 비트 inode를 얻은 다음 EOVERFLOW errno를 던집니다. 물론 아무것도 출력하지 않습니다.
나는 성공적으로 readdir()
대신에 readdir64()
을 사용해 보았습니다. 나는 더 이상 errno EOVERFLOW를 얻지 않으며 터미널에서 줄이 나오지 만 파일 자체는 인쇄되지 않습니다. 나는 이것이 버퍼가 어떤 것인가에 의한 것이라고 가정하고있다. dirent
이 기대한다.
나는이 문제를 완화하려고 dirent64
를 사용하려고했지만 내가 이것을 시도 할 때마다 내가 얻을 : 수동으로 dirent
의 dp->d_name
버퍼를 이동하는 방법이 있는지
test.c:19:22 error: dereferencing pointer to incomplete type
printf(" %s\n", dp->d_name);
내가 궁금하네요 readdir()
와 함께 사용됩니다. gdb에서 readdir()
및 dirent
을 사용하면 dp->d_name[1]
에 나열된 디렉토리를 갖는 dp->d_name
이 표시되는 반면, readdir64()
및 dirent
은 dp->d_name[8]
에 첫 번째 디렉토리를 제공합니다.
어쨌든 dirent64
이 작동하거나 어쩌면 나는 잘못된 경로에 있습니다.
마지막으로, -m32
플래그가 포함되지 않은 상태에서 프로그램이 완벽하게 작동한다는 점에 유의할 가치가 있습니다. 따라서 나는 어딘가에 32/64 호환성 오류가 있다고 가정합니다. 어떤 도움을 주셔서 감사합니다.
누락 된 유형을 정의하고 dirent64를 사용하면 어떨까요? – Martin
내 프로그램에서만 dirent.h에 정의 된 것과 같은 방식으로 dirent64를 정의하겠습니까? – PKFiyah
그 ...비트/dirent.h 밖으로 구조체를 yanking 후 실제로 코드에서 수동으로 퍼팅 실제로 완벽하게 일했다. 아마도 어딘가에 대신 사용할 수있는 정의가있을 것이라고 확신하지만, 지금은 효과가 있습니다. 감사! – PKFiyah