CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): HellCat (reentrant.� )
날 짜 (Date): 1995년07월13일(목) 16시55분52초 KDT
제 목(Title): 로칼 변수 다시.





우선 옵티마이즈가 되서 대부분 경우 로칼 오토클래스가
GCC  에서는 아마 레지스터로 심져 포인터도 들어가기
쉬울꺼에요.

그럴 경우는 일단 다른 함수가 불려 지면 프로그램 스택으로
레지스터들이 푸쉬푸쉬..될텐데.. 그 차례는 어떻게
가정을 할수가 없죠. 가정을 해서 했는데..그게 틀려진다고
해도 전혀 어디에 불평할 곳이 없으니까요.


우선 시작은 함수 자체의 주소 즉..

void foo() 일경우

void *ptr = (void*)foo; 해놓으면 일단 함수로의
엑세스 포인터는 구해지지만..


거기서 부터믄 천상 콤파일러를 리버스 엔지니어링 기법으로
룰을 찾아내던지..콤파일러 소스코드를 뒤져서
방법을 찾아내야 하는데...


사실..저 궁금한 것은..그 방법보다도

어째서.. C 의 스코핑 룰을 완전히 무시해야 하는
것을 하려고 하시는지...정말 궁금해요..


사실..C 를 공부할때 이런것은 절대로 하지 말아라 하고
해야 하는 것 같은데..


어쨋던 시작은 함수자체의 주소인데요.


그리고 시 자체내에서 스택에 access 가 가능한건지..
인라인 어셈블리를 쓰지 않고서..글쎄요.


사실 프레임포인터 내의 정보는 머 시스템 스택이라고
할수가 없는데.

즉..펑션 포인터 부텀 오프셋으로 잡아내는 것은 스택이라고
할수가 없을테고.. 리턴주소하고 펑션주소등이 어셈블리
종류에 따라서 또 레지스터 들하고 그런것들이 시스템 스택에
푸쉬 해놓고 점프를 할텐디..


그 스택은 씨에서 엑세스 하는 길이 없는 걸로 아는데..
인라인 어셈브리 외에는요.


즉 펑션 포인터 자체는 알수 있어도 그것이 푸쉬되고
또 레지스터들이 푸쉬되어 들어간 스택 자체는 엑세스가
없는 걸로 알아요.

---
  if (t_snddis(KIDS[i].fd, (struct t_call *)NULL) == -1)
    { t_error("날 죽여라!!"); longjmp ((jmp_buf) HELL, -1); }
[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.