로컬변수의 심볼을 어떻게 알아내나요??
글쓴이: alwaysN00b / 작성시간: 화, 2006/04/11 - 1:04오전
아직 내공이 부족한지라...
C에서 로컬 변수의 심볼을 알아낼수있나요??
예를 들어
char myVal;
이라고 한다면, myVal 이라는 심볼을 읽어올수 있나요??
main(){ char myVal; printf("%s \n", <span> 심볼을 읽어온다 </span> ); }
Forums:
symbol을 읽어 온다는
symbol을 읽어 온다는 것이 무얼 뜻하는 것인지 잘 모르겠군요. 혹시 symbol 이름을 문자열 타입으로 얻어 오고 싶다는 건가요? 전처리기 연산자인 '#'를 쓰지 않은 한, 문자열 이름을 얻어낼 방법은 없습니다.
Symbol도 일종의 data type으로 취급하는 LISP, Scheme 계열이 아닌 이상, symbol name을 문자열로 얻어내는 방법은 거의 존재하지 않습니다.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
답변 감사합니다.
답변 감사합니다.
그럼 전처리 연산자 #을 사용했을때는 어떻게 할수 있나요??
제가 하고자하는것은
1. 전역변수가 너무 많고
2. 오버플로우가 났을때 덮어쓰는 변수가 o/s별로 틀려서
변수들의 저장 위치가 어떻게 되는지 , type별로 정렬이 되는지 알고 싶습니다.
뭐.. 각변수마다 주소를 얻어오는 노가다를 할까 하다가 생각나서 올려봅니다.
컴파일시 -g 옵션을 붙이면, 혹시나 심볼 테이블이 어딘가에 있지않을까 해서요..
답변 부탁드립니다.
언제나 시작
심볼 테이블에 local
심볼 테이블에 local 변수는 추가되지 않는 것으로 압니다만...
local 변수라기 보다는
local 변수라기 보다는 자동 변수가 추가되지 않는 것입니다.
local이라할지라도, static이 붙으면 symbol table에 등록됩니다.
---
http://coolengineer.com
오 그건
오 그건 몰랐네요...
그럼
여기서 a가 심볼로 접근가능한 방법이 있다는 말이신지...
심볼 테이블에
심볼 테이블에 있다고 해서 모두 접근할 수 있는 것은 아닙니다.
nm으로 확인한뒤 가까이에 있는 것으로부터 접근하면 될 수 도 있겠지만..
재미로만 쓸 일입니다.
---
http://coolengineer.com
흠.. 먼가 좀 정리가
흠.. 먼가 좀 정리가 필요할 것 같은데,
일반적으로, external identifier (일반 함수, 전역 변수)들은 symbol table에 들어가며,
static으로 선언한 함수나 변수들도 symbol table에 들어갑니다. object 파일의 symbol 목록을 보려면 nm을 쓰면 됩니다. (nm과 c++filt 참고)
물론 strip으로 모든 symbol을 없애버리면 nm으로도 확인할 수 없습니다.
그리고 맨 처음 질문하신 alwaysN00b님의 원래 뜻은 symbol table과 큰 관계가 없을 것 같습니다. 목적이 "오버플로우가 났을때 덮어쓰는 변수가 o/s별로 틀려서..."라면, 오버 플로우가 나지 않도록 코드를 고쳐야지, 각 변수들의 위치가 어디인지 알아봤자 문제 해결에 도움이 되지 않습니다. 또 이 위치들은 시스템,컴파일러에 따라 다르기 때문에, 더욱 알 필요가 없습니다. 정 궁금하시다면 dwarf나 elf format을 뒤져 보면 도움이 될 겁니다.
먼저, 코드를 고치기 바랍니다. gdb나 valgrind, efence을 잘 활용하면 더욱 쉽게, 문제점을 해결할 수 있을 겁니다.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
답변
답변 감사합니다.
제가 질문했을때 gdb를 이용해 오버플로우가 나는 부분은 수정한 후 입니다.
(문제를 해결못해서 질문한게 아니었습니다.)
다만 변수들이 text영역에 어떻게 배치되는지 알고 싶었을 뿐입니다.
sun에서는 오버플로가 나도 운좋게 동작했는데 hp장비에서는 안되었습니다.
"컴파일러에 따라 다르기 때문에, 더욱 알 필요가 없습니다. " 이게 답이 되겠지만, 제가 궁금해졌던건 -g 옵션으로 컴파일 하고 gdb등으로 디버깅시 변수 값을 출력할때 그변수명을 어떻게 찾아가는지였습니다.
nm과 c++filt 참고하라하셨는데 답이 있으면 좋겠군요.
ps. 아직 실력이 안되 용어 사용이 적합하지 않았던것 같습니다. 죄송합니다.
언제나 시작
댓글 달기