floating-point register 만 무시할 수 있다면, 리눅스 상에서는
C 언어만으로도 동일한 기능 구현이 가능합니다.
하지만, 이미 표준 라이브러리에 non-local jump 가 제공되므로, 이를
활용하는 것이 여러모로 좋으리라 생각합니다.
#include <setjmp.h>
#include <stdio.h>
int z;
jmp_buf jb;
void f(int x, int y)
{
z = x * y;
longjmp(jb, 1); // jumps to main
}
void ff(int y)
{
f(2, y);
z = 10; // never executed
}
int main(void)
{
if (setjmp(jb) == 0)
ff(3);
printf("%d\n", z); // prints 6, not 10
return 0;
}
그나저나 OP 의 "함수 A는 메모리에서 삭제해야 합니다" 가 단순히
non-local jump 를 뜻하는 것인지, 실제 물리적 메모리에서 함수 스택 및
함수 이미지를 지워야 한다는 뜻인지는 분명치 않네요.
안될듯..
스택에 순서대로 호출되서 쌓이는데 A를 삭제하면 돌아갈 곳이 없어지잖아요
안될거라고 생각하는데요...
그런거 없다
캐너리 비트같은 것이 복잡하게 쌓이지 않는다면야리턴어드레스를 변조하는
캐너리 비트같은 것이 복잡하게 쌓이지 않는다면야
리턴어드레스를 변조하는 법도..
-----------------
한글을 사랑합니다.
DLL을 제외한다면, LISP 계통의 언어가 아닌 이상, 함수를 메모리에
DLL을 제외한다면, LISP 계통의 언어가 아닌 이상, 함수를 메모리에서 제거하는 것은 불가능합니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
저는 답은 잘 모르겠지만, (안될꺼 같긴 한데...^^:;)호기심에서
저는 답은 잘 모르겠지만, (안될꺼 같긴 한데...^^:;)
호기심에서..왜 그런 상황이 필요한지 정말 궁금합니다.~
주어진 문제가 어떤건지 알려주시면 안될까요?^^
권위를 의심할 것,어긋남을 존경할 것,자리잡기를 거부할 것,항상 자신을 재창조할 것 - MIT 미디어랩 -
가능못할건 또 없죠..
머 실용성은 없겠지만..
inline assembly 로
마치 a 에서 온것이 아닌냥..
link register 를 변조하고
함수 text 부분을 지우고.. 하면 불가능할것도 없죠..
Re: 가능못할건 또 없죠..
조그마한 예제를 올려주시면 감사하겠습니다.
마침 제가 예전에 테스트용으로 만들어본 소스가 있어서 올립니다.vc+
마침 제가 예전에 테스트용으로 만들어본 소스가 있어서 올립니다.
vc++에서만 컴파일 되구요.
흠 함수 지우는 부분은 아니고 장모군님이 말씀하신 "inline assembly로 마치 a에서 온것이 아닌냥.." 하는 부분입니다.
main에서 ff(3)을 호출하면 ff함수에서는 f(2,3)을 호출합니다.
f(2,3)은 전역변수 z를 2*3으로 설정하고 main으로 곧바로 돌아갑니다.
그래서 ff함수의 z=10이 실행되지 않고 6이 출력됩니다.
[quote="kkb110"]마침 제가 예전에 테스트용으로 만들어본 소스
floating-point register 만 무시할 수 있다면, 리눅스 상에서는
C 언어만으로도 동일한 기능 구현이 가능합니다.
하지만, 이미 표준 라이브러리에 non-local jump 가 제공되므로, 이를
활용하는 것이 여러모로 좋으리라 생각합니다.
그나저나 OP 의 "함수 A는 메모리에서 삭제해야 합니다" 가 단순히
non-local jump 를 뜻하는 것인지, 실제 물리적 메모리에서 함수 스택 및
함수 이미지를 지워야 한다는 뜻인지는 분명치 않네요.
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
좋은거배워가네요~ 감사합니다 전웅님! :D
좋은거배워가네요~ 감사합니다 전웅님! :D
댓글 달기