2010-02-02 2 views
3

유닉스에서 실행되는 프로그램으로 컴파일 된 foo() 함수가 있다고 가정 해 보겠습니다.라이브 러닝 유닉스 코드 패치 방법

프로그램이 실행되는 동안 foo()의 수정 된 버전을 포함하는 객체 파일을 동적으로로드하여 함수 foo를 "바꿀"수 있습니까?

이전에 작업 한 임베디드 시스템에서 텍스트 세그먼트를 보호 해제하고 foo()의 주소를 새로 수정 한 foo()를 가리 키도록 "패치"할 수있었습니다.

고객 사이트에서 경우에 따라 디버깅하고 많은 특수한 제약이있는 경우에 사용되었습니다.

유닉스에서 가능합니까?

+0

OS에 대한 자세한 정보를 제공 할 수 있습니까? 일반적으로 그렇습니다. 그러나 직면하게 될 특정 장애물은 실행중인 플랫폼에 의해 결정됩니다. – richo

+0

예, 운영 체제는 Solaris 및 IBM AIX입니다. 모든 답장을 보내 주셔서 감사합니다. – Foo

답변

1

환경에 따라 다를 수 있습니다. Erlang 모듈에서는 hot-swapping 프로덕션 코드가 사소하고 Ruby에서는 그리 어렵지 않다는 것을 알고 있습니다. C는 다른 동물 일 수 있습니다.

+0

Erlang의 내장 핫 스왑 – pestilence669

0

부족함은 물론 가능합니다. 문제는 실제로 얼마나 어렵습니까?

& 언로드 공유 라이브러리 (.so & .DLL)를 Linux의 & Windows에로드 할 수 있습니다. UNIX의 특정 변종, 확실하지 않습니다. 이것이 목표를 달성하는 가장 쉬운 방법입니다.

손이 더러울지라도 코드 세그먼트를 패치하여 언제든지 힙에서 다른 곳으로 이동할 수 있습니다. 나는 그것을 추천하지 않는다.

1

예. 결국 gdb와 같은 디버거가 작동합니다.

+0

을 ptrace() 시스템 콜, AFAIK를 통해 특별히 언급했습니다. – asveikau