2014-11-10 1 views
2

저는 실행 파일의 파일 크기를 줄이기 위해 작은 해킹 작업을 해왔습니다. 실행 가능한 압축을 수행하는 도구가 있음을 알고 있습니다 만, 이것은 심각한 것보다 내 자신의 즐거움을위한 것입니다.파이프에서 코드 실행

제 생각은 gzip으로 실행 파일을 압축 한 다음 실행 프로그램이라고하는 다른 C 프로그램에 배열로 포함시키는 것입니다. 런처를 실행하면과 같이 배관 시스템을 설정합니다 : 그것은 부모가 그것을 공급 어떤 압축 해제 있도록

parent launcher -> fork 1 of launcher -> fork 2 of launcher 

포크 1, GZIP 자체로 바뀌고 포크로 압축 해제 버전을 뱉어 2.

여기에 해킹이 일어납니다. 포크 2는 파일 "/ dev/fd/n"을 exec하려고 시도합니다. 여기서 n은 포크 1에서 포크 2로가는 파이프의 파일 번호입니다. 본질적으로 이것은 포크 2가 어떤 바이너리 gzip이 나올 지 실행합니다.

그러나 이것은 작동하지 않습니다. 놀랍지 만 깜박입니다. "/ dev/fd/n"에서 execv를 실행하는 행은 -1 EACCES (Permission denied)를 반환합니다. 내가 터미널을 열고 ls -l /dev/fd/를 실행하는 경우 그러나, 나는 같은 것을 얻을 : 그들 모두

lrwx------ 1 blackle users 64 Nov 10 05:14 0 -> /dev/pts/0 
lrwx------ 1 blackle users 64 Nov 10 05:14 1 -> /dev/pts/0 
lrwx------ 1 blackle users 64 Nov 10 05:14 2 -> /dev/pts/0 
lr-x------ 1 blackle users 64 Nov 10 05:14 3 -> /proc/17138/fd 

이 권한 + X이 그것이 아니, 실행해야 의미 사용자에 대한 (나.)? 또는 이것은 단지 이상한 커널 에지 케이스인데, 으로 권한이 없지만 실제로는 실제 파일이 아니기 때문에 실행할 수 없습니다.

답변

2

mmap이 가능한 파일 만 실행할 수 있습니다. 파이프는 순차적 특성과 제한된 버퍼 크기로 인해 불행하게도 mmapable하지 않습니다 (이전 코드를 다시 읽어야 할 수도 있습니다. 이전 코드를 다시 읽어야 할 수도 있습니다).

ramfs에서 파일을 생성하고 부모의 메모리 공간의 영역에 파이프를 사용하는 대신 비 압축 코드를 mmap에 복사 한 다음 최종적으로 자식 exec ramfs에있는 파일은 마침내 부모 파일의 ramfs에서 파일의 링크를 해제하므로 자식이 종료 될 때 자동으로 해제됩니다.

호프가 도움이되었는데, 명확하지 않은 부분이 있으면 의견을 말하십시오.

+0

ramfs는/tmp를 의미합니까? 나는 항상 그/tmp가 –

+1

인 것을 가정했다. @ blacklemon67/tmp는 때로는 ramfs이지만, 오래된 시스템에서는 디스크상의 실제 파일 시스템이지만 ramfs는 RAM에 있고 디스크에는 존재하지 않는 파일 시스템이다. 당신이 그걸로 끝내 자마자 파괴. 만드는 법은 http://www.jamescoyle.net/how-to/943-create-a-ram-disk-in-linux에서 확인하십시오. – Vality

관련 문제