바이너리에 대한 정보를 얻기 위해 otool을 사용하고 있습니다. vmaddr 0x0000000100000000
otool을 사용하여 이진 파일의 크기를 얻으려면 어떻게해야합니까?
문제에
우리는 그command 1
segname __TEXT
시작으로 여기에서 볼 수 있습니다
Load command 0
cmd LC_SEGMENT_64
cmdsize 72
segname __PAGEZERO
vmaddr 0x0000000000000000
vmsize 0x0000000100000000
fileoff 0
filesize 0
maxprot 0x00000000
initprot 0x00000000
nsects 0
flags 0x0
Load command 1
cmd LC_SEGMENT_64
cmdsize 952
segname __TEXT
vmaddr 0x0000000100000000
vmsize 0x0000000000268000
fileoff 0
filesize 2523136
maxprot 0x00000005
initprot 0x00000005
nsects 11
flags 0x0
바이너리 크기가 2.3MB이고 0x0000000100000000 4 2GB입니다 것입니다 : 여기에서는 출력의 일부입니다!
주소 중간에 "1"은 64 비트 아키텍처와 관련이 있고 0x0000000100000000
은 실제로 주소가 0x00
인 것으로 가정합니다. 그것에 관한 정보를 찾고 있었지만 유용하다고 생각하지 못했습니다. 누구나 내 가정을 확인하고 정확하게 작동하는지 설명 할 수 있습니까?
내 응용 프로그램이 RAM에로드 될 때 하위 비트가 올바르게 표시됩니다. RAM에서 memmory를 덤프하려면 0x00과 0x268000 사이에있는 메모리를 찾아야합니다. – Sayaki
아니요! 바이너리는 주소가 0x0000000100000000, 즉 4GB 경계 바로 위의 'otool'출력에 쓰여진 것과 똑같이 가상 메모리에 매핑됩니다. 그 아래의 모든 공간은 누군가가 액세스하려고 할 때마다 세그 폴트하는 "유효하지 않은"페이지를 위해 예약되어 있습니다. 실제 RAM에있는 곳은 어디에도 관계가 없습니다 (운영 체제의 변덕에 따라 달라질 수 있습니다. 예를 들어 바꿔 넣을 경우 투명하게 이동할 수 있습니다). –
좋아, 이제 모든 걸 얻는다. 도움을위한 THX :) – Sayaki