스스로를 속이십시오.이 질문은 시스템과 같은 유닉스의 내부 작업과 일반적으로 프로그래밍에 대해 비교적 새로운 것으로 보았을 때 순진하고 어리석은 것처럼 보일 것입니다.
준비된? 승인! 나는 약 3 단계의 ludicrosity를 겪을 것이고, 내가 갈수록 증가합니다.
우리는 비슷한 하드웨어를 가진 두 개의 시스템을 가지고 있습니다 (주요 지점은 표준 인텔 코어 2 듀오입니다).
하나는 (리눅스 배포판을 삽입하십시오 : 우분투는 이후에 사용될 것입니다), 다른 하나는 Mac OS X이라고 말하고 있습니다.
하나는 동등한 프로그램을 컴파일합니다.
int main()
{
int cat = 33;
int dog = 5*cat;
return dog;
}
공유 라이브러리의 의미를 아직 고려하고 싶지 않기 때문에 코드는 매우 간단합니다.
해당 시스템에서 컴파일 할 때. ELF와 Mach-O의 결과가 출력의 주요 차이점이 아닙니까? 플랫 바이너리를 남기고 포맷의 각 바이너리를 제거해야한다면 분해 된 기계 명령어가 동일하지 않습니까? (컴파일러 습관 / 경향에 따라 약간의 차이가있을 수 있습니다).
1.) 우분투 시스템에서 생성 된 플랫 바이너리를 Mach-O 형식으로 재 포장하는 프로그램을 개발하려는 경우 Mac OS X 시스템에서 실행됩니까? 그렇다면 위의 가정 된 프로그램의 컴파일 된 바이너리 만 가지고 있고 플랫 바이너리를 다시 포장하기위한이 신비로운 도구를 가지고 있다면 간단한 프로그램을 Mac OS X 시스템에서 실행할 수 있습니까?
이제 좀 더 살펴 보겠습니다.
이제 다음과 같은 소스가있는 프로그램이 있습니다.
#include <stdio.h>
int main()
{
printf("I like tortoises, but not porpoises");
return 0;
}
2.) 이 프로그램이 컴파일되고 정적으로 링크되어 있다고 가정하면, 우리의 마법 프로그램은 여전히 원시 바이너리를 Mach-O 형식으로 다시 패키지 할 수 있고 mac os X에서 작동합니까? 다른 바이너리에 의존 할 필요가없는 것으로 보았습니다 (이 경우 mac 시스템에는 없을 것입니다)
그리고 이제 최종 레벨을 위해;
3.) 이 가정 된 프로그램을 사용하여 필요한 모든 공유 라이브러리를 Mach-O 형식으로 변환 한 다음 대신 동적 링크로 위의 프로그램을 컴파일하면 어떻게 될까요? 프로그램이 계속 실행됩니까?
현재로서는 불합리한 각 단계가 이전의 기초에 의존하여 이해하기 쉽습니다. 따라서 첫 번째 기둥이 파괴되면 나머지 계층에 많은 장점이 있는지 의심합니다.
나는 GUI를 염두에 둔 프로그램으로 이것을 생각하지 않을 것입니다. 윈도우 시스템은 아마도 다른 두통 일 것입니다. 이 단계에서는 명령 줄 프로그램 만 고려하고 있습니다.
이제 저는 세상에 저를 바로 잡아달라고 말하고 부조리 한 사고 방식에 문제가있는 모든 것을 말해주었습니다.