[C++] 함수호출시에 ("문자열")파라미터는 data segme
#include<iostream>
using namespace std;
void show(char a, char b, char c, char d)
{
unsigned int e = 0xdddddddd;
}
int main()
{
unsigned int p1 = 0xeeeeeeee;
unsigned int p2 = 0xffffffff;
show('&','#','!','$');
return 0;
}
위 소스를 디버깅 했습니다.
0066FD76 CC CC CC CC CC CC CC CC CC CC CC CC CC .............
0066FD83 CC CC CC CC CC DD DD DD DD F8 FD 66 00 ...........f.
0066FD90 93 10 40 00 26 00 00 00 23 00 00 00 21 ..@.&...#...!
0066FD9D 00 00 00 24 00 00 00 00 00 00 00 C0 44 ...$........D
0066FDAA 6B 81 00 00 56 00 CC CC CC CC CC CC CC k...V........
0066FDB7 CC CC CC CC CC CC CC CC CC CC CC CC CC .............
0066FDC4 CC CC CC CC CC CC CC CC CC CC CC CC CC .............
0066FDD1 CC CC CC CC CC CC CC CC CC CC CC CC CC .............
0066FDDE CC CC CC CC CC CC CC CC CC CC CC CC CC .............
0066FDEB CC CC CC CC CC FF FF FF FF EE EE EE EE .............
0066FDF8 38 FE 66 00 D9 83 40 00 01 00 00 00 B0 8.f...@......
main 함수의 지역변수와 show함수의 지역변수사이에 garbage값이
많이 들어가는것과
show함수로 전달되는 파라미터는 1byte char형이지만
4byte공간을 설정하고 있습니다. 그런데 유독 첫번째 파라미터인 '&'의 경우에만 2byte를 잡는다는것
이 두가지가 좀 이해가 안되지만..
어느정도 예상한대로..stack segment에 저장이 됐습니다.
소스를 바꿔서
#include<iostream>
using namespace std;
void show(char *a, char *b, char *c, char *d)
{
unsigned int e = 0xdddddddd;
}
int main()
{
unsigned int p1 = 0xeeeeeeee;
unsigned int p2 = 0xffffffff;
show("&&&&","####","!!!!","$$$$");
return 0;
}
문자열을 전달하면 stack segment 상에서는 전달한 파라미터의 문자열들을
찾아 볼수가 없습니다.
0066FD76 CC CC CC CC CC CC CC CC CC CC CC CC CC .............
0066FD83 CC CC CC CC CC DD DD DD DD F8 FD 66 00 ...........f.
0066FD90 9F 10 40 00 1C E0 42 00 24 E0 42 00 2C ..@...B.$.B.,
0066FD9D E0 42 00 34 E0 42 00 00 00 00 00 54 21 .B.4.B.....T!
0066FDAA 6B 81 00 00 56 00 CC CC CC CC CC CC CC k...V........
0066FDB7 CC CC CC CC CC CC CC CC CC CC CC CC CC .............
0066FDC4 CC CC CC CC CC CC CC CC CC CC CC CC CC .............
0066FDD1 CC CC CC CC CC CC CC CC CC CC CC CC CC .............
0066FDDE CC CC CC CC CC CC CC CC CC CC CC CC CC .............
0066FDEB CC CC CC CC CC FF FF FF FF EE EE EE EE .............
0066FDF8 38 FE 66 00 E9 83 40 00 01 00 00 00 B0 8.f...@......
어짜피 파라미터의 데이터 형은 char * 주소값이었니까 어쩌면 stack segment에 문자열 자체는 없는게 당연한거 같은데요..
그렇다면 실제 문자열은 data segment에 저장이 되어있는것인가요?
답변부탁드립니다.
네. 실제 문자열은 .data에 저장되고 해당 위치를 가르키는 주소값이
네. 실제 문자열은 .data에 저장되고 해당 위치를 가르키는 주소값이 인자로 들어갑니다.
얼핏 보고 리눅스에서 테스트하신 줄 알았는데 윈도셨네요. :) 스택 주소가 평소 보던것이랑 다르길레요..
Re: [C++] 함수호출시에 ("문자열")파라미터는 data s
유독 첫번째 파라미터만 두바이트가 아니라 little endian 이므로 앞의 00 은 & 를 표현하기위해 들어간것이 아닙니다. 모두 4 byte 로 표현되어 있군요
---
http://coolengineer.com
readelf 같은 툴로 섹션을 검사해보시면 눈에 확연히 나타납니다. r
readelf 같은 툴로 섹션을 검사해보시면 눈에 확연히 나타납니다. readpe도 있는지는 잘 모르겠군요. :-P
Matt Pietrek씨가 만든 PE View라는 툴이 있습니다.
Matt Pietrek씨가 만든 PE View라는 툴이 있습니다.
높이 날다 떨어지면.
아푸다 ㅡ,.ㅡ
답례글이 늦었습니다. 죄송합니다..
little endian인데.. 잘못봤습니다. 죄송합니다. ^^;
0066FD90 93 10 40 00 26 00 00 00 23 00 00 00 21 ..@.&...#...!
0066FD9D 00 00 00 24 00 00 00 00 00 00 00 C0 44 ...$........D
readelf를 실행해 봤습니다.
readelf - ELF 포맷의 오브젝트 파일의 정보 출력
이라는 설명을 보고
비쥬얼 6.0으로 컴파일된 obj,exe 파일을 시험해 봤지만 안됐습니다.
readelf -S Cpp2.exe
readelf -S Cpp2.obj
그래서 gcc로 새로 컴파일해서
옵션이 잘못된거 같은데요..
나와있는 옵션을 다 해봤습니다.
그중에 -w 를 하니까 다양한 정보가 많이 나왔는데요.. 무슨 내용인지는
잘 모르겠습니다.
제가 원하는 메모리상의 stack segment는 나오질 않습니다.
stack segment는 실행과정에서 계속 변하기 때문에
윈도의 debug 나 vc 처럼..순간순간 trace해가면서 봐야하는데
readelf나 objdump 같은 유틸로는 볼수 없는게 아닌가요?
볼수 있다면 설명부탁드립니다.
변수의 메모리 실제 저장위치
이렇게 선언하면, 실제 char는 1Byte지만 메모리 관리 측면을 보았을때,
1byte 접근이나 4byte접근이나 별 차이가 없기때문에, 4byte align을
하는것으로 보여집니다.
이경우, 포인터이기 때문에 실제 문자열을 가르키고 있는 번지만 저장되어
있기 때문에, 해당 문자열을 직접 확인하시려면 해당 데이타 번지에서
참조하시면 될것 같습니다.
http://www.korone.net QT 커뮤니티 사이트
Re: 답례글이 늦었습니다. 죄송합니다..
gdb 로 볼 수 있지요.. CLI이기 때문에 화딱지 나시겠지만요..
---
http://coolengineer.com
좋은 답변감사합니다.
gdb로 보면 되는군요.. ^^;
댓글 달기