이는 Ubuntu Online, Fedora Online, Windows 온라인 에뮬레이터 또는 MAC OS 온라인 에뮬레이터와 같은 여러 무료 온라인 워크스테이션 중 하나를 사용하여 OnWorks 무료 호스팅 제공자에서 실행할 수 있는 명령 c2ph입니다.
프로그램:
이름
c2ph, pstruct - "cc -g -S" stabs에서 생성된 C 구조 덤프
개요
c2ph [-dpnP] [var=val] [파일 ...]
옵션
옵션 :
-w 폭; 약어: type_width=45 member_width=35 offset_width=8
-x 08진수; 약어: offset_fmt=x offset_width=04 size_fmt=x size_width=XNUMX
-n perl 코드를 생성하지 않습니다(pstruct로 호출될 때 기본값).
-p perl 코드 생성(c2ph로 호출될 때 기본값)
-v C 선언을 주석으로 사용하여 Perl 코드 생성
-i 내장 데이터 유형의 크기를 다시 계산하지 않음
-내장에 대한 덤프 정보도
-t 추적 실행
-d 디버깅 출력을 분출합니다.
-slist는 쉼표로 구분된 목록에 덤프할 구조를 제공합니다.
기술
다음은 Tom Christiansen이 작성한 이전 c2ph.doc 문서입니다.[이메일 보호]>
날짜: 25년 91월 08일 10:21:XNUMX GMT
옛날 옛적에 나는 pstruct라는 프로그램을 작성했습니다. 그것은 펄 프로그램이었습니다.
C 구조를 분석하고 해당 멤버 오프셋을 표시합니다. 이것은 특히
바이너리 덤프를 보거나 커널을 살펴보는 사람들에게 유용합니다.
Pstruct는 예쁜 프로그램이 아니었습니다. 특히 견고하지도 않았습니다. 문제는 당신
C 컴파일러는 내가 기대했던 것보다 C를 파싱하는 데 훨씬 뛰어났습니다.
그래서 나는 똑똑해졌습니다. 게으르기로 결정하고 C 컴파일러가 C를 구문 분석하도록 했습니다.
내가 읽을 수 있도록 디버거 찌르기. 이들은 구문 분석하기가 훨씬 쉬웠습니다. 아직은 아니다
예쁜 프로그램이지만 적어도 더 강력합니다.
Pstruct는 .c 또는 .h 파일, 또는 바람직하게는 .s 파일을 사용합니다.
어쨌든 그들을 마사지하고 다음과 같은 목록을 뱉어냅니다.
구조체 tty {
정수 tty.t_locker 000 4
정수 tty.t_mutex_index 004 4
구조체 tty * tty.t_tp_virt 008 4
구조체 clist tty.t_rawq 00c 20
정수 tty.t_rawq.c_cc 00c 4
정수 tty.t_rawq.c_cmax 010 4
정수 tty.t_rawq.c_cfx 014 4
정수 tty.t_rawq.c_clx 018 4
구조체 tty * tty.t_rawq.c_tp_cpu 01c 4
구조체 tty * tty.t_rawq.c_tp_iop 020 4
부호 없는 문자 * tty.t_rawq.c_buf_cpu 024 4
서명되지 않은 문자 * tty.t_rawq.c_buf_iop 028 4
구조체 clist tty.t_canq 02c 20
정수 tty.t_canq.c_cc 02c 4
int tty.t_canq.c_cmax 030 4
int tty.t_canq.c_cfx 034 4
int tty.t_canq.c_clx 038 4
구조체 tty * tty.t_canq.c_tp_cpu 03c 4
구조체 tty * tty.t_canq.c_tp_iop 040 4
부호 없는 문자 * tty.t_canq.c_buf_cpu 044 4
서명되지 않은 문자 * tty.t_canq.c_buf_iop 048 4
구조체 clist tty.t_outq 04c 20
정수 tty.t_outq.c_cc 04c 4
정수 tty.t_outq.c_cmax 050 4
정수 tty.t_outq.c_cfx 054 4
정수 tty.t_outq.c_clx 058 4
구조체 tty * tty.t_outq.c_tp_cpu 05c 4
구조체 tty * tty.t_outq.c_tp_iop 060 4
부호 없는 문자 * tty.t_outq.c_buf_cpu 064 4
서명되지 않은 문자 * tty.t_outq.c_buf_iop 068 4
(*int)() tty.t_oproc_cpu 06c 4
(*int)() tty.t_oproc_iop 070 4
(*int)() tty.t_stopproc_cpu 074 4
(*int)() tty.t_stopproc_iop 078 4
구조체 스레드 * tty.t_rsel 07c 4
등
실제로 이것은 특정 옵션 집합에 의해 생성되었습니다. 당신은 제어 할 수 있습니다
와이드 또는 팻, XNUMX진수 또는 XNUMX진수, 선행 XNUMX을 선호하는지 여부에 관계없이 각 열의 서식 지정
또는 무엇이든.
이것을 사용하기 위해 필요한 것은 BSD/GCC 스타일 찌르기를 생성하는 C 컴파일러뿐입니다.
The -g 기본 BSD 컴파일러 및 GCC의 옵션에서 이를 얻을 수 있습니다.
자세히 알아보려면 다음과 같은 가짜 옵션을 입력하세요. -\?, 긴 사용 메시지는
제공. 상당히 많은 가능성이 있습니다.
C 프로그래머라면 여기까지가 메시지의 끝입니다. 종료할 수 있습니다
지금 당장 그리고 마음에 든다면 소스를 저장해 두었다가 원할 때 실행하세요. 또는
아니.
그러나 당신이 펄 프로그래머라면 나는 당신보다 훨씬 더 놀라운 것을 가지고 있습니다.
구조 오프셋 프린터에 불과합니다.
다른 incybernation인 c2ph로 pstruct를 호출하면 코드 생성기가 있습니다.
그것은 C 코드를 펄 코드로 변환합니다! 글쎄요, 구조와 노동 조합 선언은 적어도
그러나 그것은 꽤 많습니다.
이 시점 이전에 C 프로그램과 상호 작용하기를 원했던 Perl로 프로그래밍하는 모든 사람은
커널과 마찬가지로 C 구조의 레이아웃을 추측한 다음 하드와이어
이것들을 그의 프로그램에 넣습니다. 물론 훌륭하게 만들어진 프로그램을
sgtty 구조가 다르게 배치된 시스템에서 프로그램이 중단되었습니다. 어느
부끄러움.
Larry의 h2ph 번역기가 도움이 되었지만 cpp 기호에서만 작동하고 작동하지 않습니다.
real C도 매우 필요했습니다. 내가 당신에게 제공하는 것은 도달하는 상징적 방법입니다
모든 C 구조. 패키지와 기능 측면에서 그것들을 설명했습니다. 고려하다
다음 프로그램:
#!/usr/local/bin/펄
'syscall.ph'가 필요합니다.
'sys/time.ph' 요구;
'sys/resource.ph' 요구;
$ru = "\0" x &rusage'sizeof();
syscall(&SYS_getrusage, &RUSAGE_SELF, $ru) && die "getrusage: $!";
@ru = unpack($t = &rusage'typedef(), $ru);
$utime = $ru[ &rusage'ru_utime + &timeval'tv_sec ]
+ ($ru[ &rusage'ru_utime + &timeval'tv_usec ]) / 1e6;
$stime = $ru[ &rusage'ru_stime + &timeval'tv_sec ]
+ ($ru[ &rusage'ru_stime + &timeval'tv_usec ]) / 1e6;
printf "%8.3fs+%8.3fu 초를 사용했습니다.\n", $utime, $stime;
보시다시피 패키지의 이름은 구조의 이름입니다. 일반 필드는
그들 자신의 이름. 또한 사용자의 편의를 위해 다음과 같은 접근자 기능이 제공됩니다.
struct 이것은 인수를 받지 않고 단지 첫 번째 수준의 수입니다.
구조의 요소. 이것을 인덱싱에 사용합니다.
아마도 이와 같은 구조 배열로
$usec = $u[ &user'u_utimer
+ (&ITIMER_VIRTUAL * &itimerval'struct)
+ &timerval'it_value
+ &timeval'tv_usec
];
sizeof 구조의 바이트를 반환하거나 다음과 같은 경우 멤버를 반환합니다.
다음과 같은 인수를 전달합니다.
&rusage'sizeof(&rusage'ru_utime)
typedef 이것은 팩으로 전달하기 위한 perl 형식 정의이며
짐 등에서 꺼내다. nothing의 typedef를 요청하면 다음을 얻습니다.
전체 구조, 그렇지 않으면 멤버의 구조를 얻습니다.
당신은 요구합니다. 패딩이 처리되고
유니온이 모든 별칭으로 압축 해제되도록 보장합니다.
그러나 Bitfields는 아직 지원되지 않습니다.
offsetof 이 함수는 해당 배열의 바이트 오프셋입니다.
회원. 인덱싱에 직접 사용할 수 있습니다.
너무 게으른 경우 vec()를 사용하여 패킹된 구조로
포장을 풀기 위해.
typeof typedef 접근자 함수와 혼동하지 마십시오.
하나는 해당 필드의 C 유형을 반환합니다. 이것은 허용 할 것입니다
당신은 일부의 멋진 구조화 된 예쁜 인쇄물을 인쇄합니다.
그것에 대해 미리 알지 못하는 구조.
이것에 대한 인수는 멍청이입니다. 언젠가는 그런 포스팅을
당신을 위해 당신의 u 구조를 버리는 것.
이것이 사용되는 것을 보는 방식은 기본적으로 다음과 같습니다.
% h2ph /usr/lib/perl/tmp.ph
% c2ph some_include_file.h >> /usr/lib/perl/tmp.ph
% 설치하다
포함을 올바르게 가져와야 하기 때문에 c2ph에서는 약간 까다롭습니다. 모르겠어
이것은 당신의 시스템을 위한 것이지만, 일반적으로 그리 어렵지는 않습니다.
내가 언급한 것처럼 코드가 예쁘지 않습니다. 1000줄 프로그램이 될 줄은 몰랐습니다.
내가 시작했을 때 또는 시작하지 않았을 수도 있습니다. :-) 그러나 나는 어떻게 덜 무심했을 것입니다
프로그램의 일부가 서로 통신하는 등. 다음과 같은 경우에도 도움이 되었을 수 있습니다.
나는 즉석에서 찌르기의 구성을 신성하게 할 필요가 없었고 마이크로를 설명했습니다.
내 컴파일러와 gcc의 차이점.
어쨌든, 여기 있습니다. Perl v4 이상에서 실행해야 합니다. 어쩌면 덜.
--톰
onworks.net 서비스를 사용하여 온라인으로 c2ph를 사용하세요