우분투 컴퓨터에서 컴파일하는 작은 C++ 프로그램이 있습니다. 프로그램은 동일한 시스템에서 잘 실행되지만 다른 Linux 시스템에서 복사하여 실행하려고 하면 인쇄됩니다.
./prog1 : 해당 파일이나 디렉터리가 없습니다.
추가 조사를 통해 대상 Linux 시스템에서 실행되는 커널에서 VDSO(linux-vdso.so.1) 지원이 활성화되지 않았음을 깨달았습니다.
다음은 내 Linux 시스템에서 프로그램의 ldd 출력입니다.
linux-vdso.so.1 => (0x00007fffda425000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6ce9114000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6ce8efe000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6ce8b38000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6ce8832000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6ce9432000)
이제 우분투 컴퓨터에서 코드를 컴파일하여 대상에서 실행하는 방법을 알고 싶습니다.
______________________________-
새로운 편집자
바이너리는 실행용으로 표시되어 있으므로 이는 문제가 되지 않습니다. VDSO는 대상 커널이 지원한다는 것을 알았으므로 확실히 문제가 되지 않습니다.
이제 대상 커널과 내 우분투 PC에 설치된 커널 사이에 차이가 있음을 발견했습니다.
대상에서....벗겨짐
Ubuntu에서 ----- prog1: ELF 64비트 LSB 실행 파일, x86-64, 버전 1(SYSV), 동적으로 링크됨(공유 라이브러리 사용), GNU/Linux 2.6.24용, BuildID[sha1]=4ab095886f476674a7bf30c11d5479f7daa91001, not 벗겨진
그렇다면 더 높은 커널 버전(예: 2.6.32)으로 코드를 컴파일해야 합니까?
답변1
linux-vdso.so는 일반적인 공유 라이브러리가 아닙니다. 전체 컨텍스트 전환 없이 일부 시스템 호출을 제공하고 일반적으로 시스템 호출을 단순화하기 위해 커널이 각 프로세스의 주소 공간에 자동으로 매핑되는 가상 라이브러리입니다. 맨페이지(온라인)에서 자세한 내용을 읽을 수 있습니다.여기). 파일에서 로드하는 것이 아니기 때문에 ldd
경로는 표시되지 않지만 매핑된 주소가 표시되므로 올바르게 로드되었는지 확인할 수 있습니다.
모든 라이브러리가 발견되었으므로 파일이 chmod +x
전혀 실행 가능( )으로 표시되지 않은 것이 가장 가능성이 높은 원인입니다.