64 비트 VM에서 32 비트 프로그램을 실행할 수 없습니다.


12

Ubuntu 10.04 32 비트 시스템에서 작은 "hello world"C 프로그램을 컴파일했습니다. 그런 다음 실행 파일 (a.out)을 Ubuntu 12.10 (64 비트) VMWare 가상 머신에 넣고 실행하려고했습니다 (./a.out). OS가 파일을 식별하지 않고 'No such file or directory (이러한 파일 또는 디렉토리 없음)'라고 말합니다. 그러나 64 비트 랩톱에서 실행되는 Ubuntu 12.10 (64 비트)에 동일한 실행 파일을 넣으면 정상적으로 실행되고 원하는 출력을 얻습니다. VM이 IBM Blade Server에서 실행 중입니다. 왜 VM의 결과를 알고 싶습니까?

답변:


20

메시지 No such file or directory가 실행 파일을 참조하지 않습니다 : a.out. 대신 32 비트 동적으로 연결된 실행 파일 을 실행하는 데 필요한 도우미 프로그램 을 나타냅니다 .a.out

이제이 좋은 기사에서이 모든 것들을 잘 설명했습니다.

정적 및 동적 연결

이진 실행 파일에는 정적 연결과 동적 연결의 두 가지 유형이 있습니다. 정적으로 링크 된 것들 에 대해 먼저 : 프로그램이 라이브러리 함수를 호출하려고 할 때 이름으로 참조합니다. 소스에서 프로그램을 빌드 할 때 프로그램에 사용 된 모든 라이브러리 기능이 라이브러리에서 프로그램으로 복사됩니다. 그런 다음 프로그램은 자체 코드와 사용하는 라이브러리 함수의 코드를 포함합니다. 그런 다음 호출 장소에서 이름이 프로그램의 해당 기능 주소로 변경됩니다. 이 프로세스는 함수 이름과 함수 자체의 구현을 연결 하기 때문에 연결 이라고합니다. 프로그램을 빌드 한 후에는 링크를 변경할 수 없으므로 static 이라고 합니다.

동적으로 링크 된 프로그램은 다르게 작동합니다.이 프로그램은 또한 이름별로 라이브러리 기능을 참조합니다. 프로그램을 빌드 할 때 두 개의 목록이 프로그램과 함께 어셈블되고 저장됩니다. 어느 위치에서 어떤 라이브러리 기능이 사용되는지와 프로그램에서 사용하는 기능이 들어있는 라이브러리가 있습니다. 프로그램을 구축하기위한 전부입니다.

나중에 실행시 특수 도우미 프로그램 인 소위 동적 링커는 라이브러리 목록의 각 라이브러리에 대해 파일 시스템의 특정 위치를 찾아 메모리에로드합니다. 이제 동적 링커는 라이브러리 함수가 사용할 수있는 메모리 주소를 알고 있습니다. 첫 번째 목록을 사용하여 라이브러리 함수를 호출하는 모든 위치에 올바른 주소를 씁니다. 그런 다음 동적으로 연결된 프로그램을 실행할 수 있습니다.


3
이 "파일을 찾을 수 없음"오류 메시지가 처음 ° ͜ ° 인 나를 혼동했습니다. 그런 다음 앱에 필요한 일부 파일이 누락되었음을 의미합니다.
Ramchandra Apte

@Radu Rădeanu, 헬퍼 프로그램 이란 무엇입니까? 동적으로 연결된 라이브러리를 추측합니다. 그렇다면 헬퍼 프로그램 이라고 부르면 설명이 모호합니다.
golem 2016 년

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.