[C++] 함수호출시에 ("문자열")파라미터는 data segme

gyxor의 이미지

#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에 저장이 되어있는것인가요?

답변부탁드립니다.

cocas의 이미지

네. 실제 문자열은 .data에 저장되고 해당 위치를 가르키는 주소값이 인자로 들어갑니다.

얼핏 보고 리눅스에서 테스트하신 줄 알았는데 윈도셨네요. :) 스택 주소가 평소 보던것이랑 다르길레요..

pynoos의 이미지

gyxor wrote:

main 함수의 지역변수와 show함수의 지역변수사이에 garbage값이
많이 들어가는것과
show함수로 전달되는 파라미터는 1byte char형이지만
4byte공간을 설정하고 있습니다. 그런데 유독 첫번째 파라미터인 '&'의 경우에만 2byte를 잡는다는것
이 두가지가 좀 이해가 안되지만..

유독 첫번째 파라미터만 두바이트가 아니라 little endian 이므로 앞의 00 은 & 를 표현하기위해 들어간것이 아닙니다. 모두 4 byte 로 표현되어 있군요

saxboy의 이미지

readelf 같은 툴로 섹션을 검사해보시면 눈에 확연히 나타납니다. readpe도 있는지는 잘 모르겠군요. :-P

비행소년의 이미지

Matt Pietrek씨가 만든 PE View라는 툴이 있습니다.

Quote:
readelf 같은 툴로 섹션을 검사해보시면 눈에 확연히 나타납니다. readpe도 있는지는 잘 모르겠군요.

높이 날다 떨어지면.
아푸다 ㅡ,.ㅡ

gyxor의 이미지

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로 새로 컴파일해서

$ gcc -o k Cpp2.c
$ readelf -S k
There are 34 section headers, starting at offset 0x1d1c:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .interp           PROGBITS        080480f4 0000f4 000013 00   A  0   0  1
  [ 2] .note.ABI-tag     NOTE            08048108 000108 000020 00   A  0   0  4
  [ 3] .hash             HASH            08048128 000128 000024 04   A  4   0  4
  [ 4] .dynsym           DYNSYM          0804814c 00014c 000040 10   A  5   1  4
  [ 5] .dynstr           STRTAB          0804818c 00018c 000045 00   A  0   0  1
  [ 6] .gnu.version      VERSYM          080481d2 0001d2 000008 02   A  4   0  2
  [ 7] .gnu.version_r    VERNEED         080481dc 0001dc 000020 00   A  5   1  4
  [ 8] .rel.dyn          REL             080481fc 0001fc 000008 08   A  4   0  4
  [ 9] .rel.plt          REL             08048204 000204 000008 08   A  4   b  4
  [10] .init             PROGBITS        0804820c 00020c 000017 00  AX  0   0  4
  [11] .plt              PROGBITS        08048224 000224 000020 04  AX  0   0  4
  [12] .text             PROGBITS        08048244 000244 00019c 00  AX  0   0  4
  [13] .fini             PROGBITS        080483e0 0003e0 00001b 00  AX  0   0  4
  [14] .rodata           PROGBITS        080483fc 0003fc 000008 00   A  0   0  4
  [15] .eh_frame         PROGBITS        08048404 000404 000004 00   A  0   0  4
  [16] .data             PROGBITS        08049408 000408 000018 00  WA  0   0  4
  [17] .dynamic          DYNAMIC         08049420 000420 0000c8 08  WA  5   0  4
  [18] .ctors            PROGBITS        080494e8 0004e8 000008 00  WA  0   0  4
  [19] .dtors            PROGBITS        080494f0 0004f0 000008 00  WA  0   0  4
  [20] .jcr              PROGBITS        080494f8 0004f8 000004 00  WA  0   0  4
  [21] .got              PROGBITS        080494fc 0004fc 000014 04  WA  0   0  4
  [22] .bss              NOBITS          08049510 000510 000004 00  WA  0   0  4
  [23] .comment          PROGBITS        00000000 000510 000132 00      0   0  1
  [24] .debug_aranges    PROGBITS        00000000 000648 000078 00      0   0  8
  [25] .debug_pubnames   PROGBITS        00000000 0006c0 000025 00      0   0  1
  [26] .debug_info       PROGBITS        00000000 0006e5 000a84 00      0   0  1
  [27] .debug_abbrev     PROGBITS        00000000 001169 000138 00      0   0  1
  [28] .debug_line       PROGBITS        00000000 0012a1 00027c 00      0   0  1
  [29] .debug_frame      PROGBITS        00000000 001520 000014 00      0   0  4
  [30] .debug_str        PROGBITS        00000000 001534 0006ba 01  MS  0   0  1
  [31] .shstrtab         STRTAB          00000000 001bee 00012b 00      0   0  1
  [32] .symtab           SYMTAB          00000000 00226c 0006f0 10     33  54  4
  [33] .strtab           STRTAB          00000000 00295c 0003ed 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)
 

옵션이 잘못된거 같은데요..
나와있는 옵션을 다 해봤습니다.
그중에 -w 를 하니까 다양한 정보가 많이 나왔는데요.. 무슨 내용인지는
잘 모르겠습니다.
제가 원하는 메모리상의 stack segment는 나오질 않습니다.
stack segment는 실행과정에서 계속 변하기 때문에
윈도의 debug 나 vc 처럼..순간순간 trace해가면서 봐야하는데
readelf나 objdump 같은 유틸로는 볼수 없는게 아닌가요?

볼수 있다면 설명부탁드립니다.

cbycby의 이미지

Quote:
void show(char a, char b, char c, char d)

이렇게 선언하면, 실제 char는 1Byte지만 메모리 관리 측면을 보았을때,
1byte 접근이나 4byte접근이나 별 차이가 없기때문에, 4byte align을
하는것으로 보여집니다.

Quote:
void show(char *a, char *b, char *c, char *d)

이경우, 포인터이기 때문에 실제 문자열을 가르키고 있는 번지만 저장되어
있기 때문에, 해당 문자열을 직접 확인하시려면 해당 데이타 번지에서
참조하시면 될것 같습니다.

http://www.korone.net QT 커뮤니티 사이트

pynoos의 이미지

gyxor wrote:

제가 원하는 메모리상의 stack segment는 나오질 않습니다.
stack segment는 실행과정에서 계속 변하기 때문에
윈도의 debug 나 vc 처럼..순간순간 trace해가면서 봐야하는데
readelf나 objdump 같은 유틸로는 볼수 없는게 아닌가요?

볼수 있다면 설명부탁드립니다.

gdb 로 볼 수 있지요.. CLI이기 때문에 화딱지 나시겠지만요..

gyxor의 이미지

gdb로 보면 되는군요.. ^^;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.