2011-07-01 2 views
3

처음으로 여기에 게시, 몇 시간 동안 봤는데 아무것도 찾을 수 없습니다.C에서 ELF 파일을 읽을 수있는 적절한 방법

다른 파일을 읽고 웹을 통해 서버 프로그램으로 보내는 클라이언트 프로그램을 작성하려고합니다. (백업 목적을 위해.)

지금까지 사용한 FREAD()이 유사한 방식으로, 버퍼에 파일을 넣어 : http://www.cplusplus.com/reference/clibrary/cstdio/fread/

그것은 일반 텍스트 파일에 대해 잘 작동, 하지만 실행 파일을 전송하려 할 때 fread()는 파일을 읽지 않고 "ELF"만 버퍼에 읽습니다.

제 질문은 ELF 파일의 내용을 C의 버퍼로 읽는 올바른 방법은 무엇입니까?

감사합니다.

+0

흠. ELF 파일은 다른 파일과 동일해야합니다. 몇 가지 코드를 게시 할 수 있습니까? – IDWMaster

+4

바이너리가 아닌 텍스트 모드로 파일을 연 것 같습니다. – tinman

+0

아마도 응용 프로그램이 파일을 읽는 방법에 대한 몇 가지 샘플 코드가 있을까요? 일반 파일 입출력을 사용하는 바이너리 파일에는 "팁과 트릭"이 없습니다 (메모리로 전체 파일을 읽는 것이 일반적으로 정당하지 않다는 점을 제외하고는). –

답변

0

이진 파일을 읽는 올바른 방법은 단순히 fread()을 사용하는 것입니다. 그러나 내용을 문자열로 처리 할 수 ​​없다는 것을 기억하십시오. 이는 다른 것들 중에서도 strlen()을 사용하여 길이를 결정할 수 없음을 의미합니다.

대신 길이를 별도의 변수에 보관해야합니다. fread()의 반환 값은 성공적으로 읽은 레코드 수를 알려줍니다. 레코드 크기를 1 (fread()의 두 번째 매개 변수)로 설정하면 읽은 바이트 수가 반환됩니다.

2

ELF 파일을 처리하는 가장 좋은 방법은 사용 가능한 것으로 가정하고 ELF 라이브러리 (libelf; Google이 알고 있음)를 사용하는 것입니다. ELF 파일은 정교한 구조를 가지고 있으며 라이브러리는 대개 파일을보다 쉽게 ​​처리합니다.

fread()을 사용해야하는 경우 데이터가 0 또는 0 바이트로 가득 차 있고 일반 문자열 함수가 데이터의 0으로 인해 데이터를 정확하게 처리하지 않는다는 것을 알고 있으면 정상적으로 작동합니다. 특히 printf()과 같은 함수는 첫 번째 0 바이트에 문자열 인쇄를 중지합니다.

네트워크를 통해 임의의 파일을 백업하려면 파일을 열면됩니다 (바이너리 모드에서는 Unix에는 아무런 영향을 미치지 않으며 Windows에서는 매우 중요합니다). 큰 블록을 메모리로 읽어서 다시 쓸 필요가 있습니다.

/* Copy the rest of f1 to f2 */ 
void fcopy(FILE *f1, FILE *f2) 
{ 
    char   buffer[BUFSIZ]; 
    size_t   n; 

    while ((n = fread(buffer, sizeof(char), sizeof(buffer), f1)) > 0) 
    { 
     if (fwrite(buffer, sizeof(char), n, f2) != n) 
      err_syserr("write failed\n"); 
    } 
} 

err_syserr() 함수는 인수 (들)에 주어진 오류를보고하고 시스템 오류 메시지 (strerror(errno))하고 종료를 추가하는 간단한 오류보고 기능입니다.

관련 문제