2017-11-19 1 views
2

EDIT : Linux 용 Windows 서브 시스템이 32 비트를 처리 할 수 ​​없다는 것이 문제인 것처럼 보입니다.Windows의 64 비트 Ubuntu에서 32 비트 어셈블리 컴파일

어셈블리 및 리눅스 초보자가 Windows의 64 비트 우분투에서 32 비트 어셈블리 (AT & T 구문)를 컴파일하려고합니다. 내 상황은 실제적으로 this other stackoverflow question의 정확한 복제본이지만 솔루션 (여러 게시물에서 반복되는 것을 볼 수 있음)이 나에게 어떤 이유로 작용하지 않습니다. 나는 Programming with the Ground Up을 사용하여 x86 어셈블리를 배우고 있으며 Windows에서 Ubuntu의 Bash에서 컴파일 할 프로그램을 얻을 수 없습니다.

내 명령에 여러 가지 옵션 조합을 시도했지만 일부는 분명히 컴파일 할 수 있지만 바이너리 파일 (형식 오류)을 실행할 수 없거나 할 수는 있지만 movl 8(%ebp), %eax에 도착하면 조각화 오류가 발생합니다. 내 소스 파일에서 (아마도 64 비트 환경에서 32 비트 스택을 설정했기 때문에 읽음). without .32code and with --32 (내 게시물 아직 너무 대신 링크를 넣어 이미지를 포함 할 수 없습니다) : 내 프로그램의 첫 번째 줄과 같은 및 as에 대한 --32 옵션을 .32code없이

ld 아무 시도는 도움이 아무것도 생산하지 않습니다. .32code없이 여전히

지금 --x32 (without .32code and with --x32)와 함께 난 당신이 내 소스 파일에 포함 그래서 여기에 .32code을 포함하지 않는 경우 등 푸시, 팝,에 문제가 발견 : with .32code and with --x32.

다음, 거기에 내가 대신 asldgcc로 만들 수 있습니다 유사한 시도가 있지만 그것은 실패의 모든 다른 조합을 포함하고 우리가 들어가 있기 때문에 벌레의 깡통을 열어 의미가 있는지 확실하지 않습니다 gcc가 필요한 라이브러리를 가지고 있는지 여부 (?). 예를 들어, gcc -m32 -nostdlib factorial.s -o factorial을 사용하면 .32code의 유무에 관계없이 "이진 파일을 실행할 수 없습니다 : EXEC 형식 오류"메시지가 나타납니다. sudo apt-get install lib32gcc-4.8-dev 및 다른 시도와 같은 것을 시도해도 아무 것도 작동하지 않는 것으로 보입니다. 많은 시간 동안 qemu-user-static과 관련된 문제가 발생할 수 있습니다. 한 번에 설치했기 때문에 지금은 모두 f %^#! d입니다.

하나의 대답은 32 비트 gcc를 설치하는 것이 좋지만 나에게 아무런 성과가없는 것 같습니다. 또 다른 해결책은 수동으로 책의 모든 예제를 64 비트로 변환하고이 모든 것을 잊어 버리는 것입니다. 4 (예 : 4(%esp) 같은 것들이 8(%esp)이 될 것입니다)하지만 8 월 8 일을 포함하는 스택을 다시 상상 함을 의미하지만, 을 movq 또는 일부 %eax에서 %rax 등으로 변경할 수도 있습니다. 이에 대한 해결책이 있어야합니다. 특히 how the poster in 2013에 정확한 문제가 해결 된 것 같습니다. 아마도 -march=CPU[+EXTENSION...] 또는 -mtune=CPU과 같은 것들로 다시 시도해야합니까? 어쩌면 아키텍처 나 리눅스, 또는/gcc에 대한 기본적인 지식이 부족한 것일까?

+0

'ld -melf_i386'은 사용할 올바른 에뮬레이션입니다. – Jester

+0

팁에 대한 @Jester 감사하지만 그 에뮬레이션을 염두에두고 필자는 .s 파일에서'.32code '를 시도했으며'- as'나'as -x32 '도 제대로 작동하지 않는 것으로 보인다. 그런 다음'.32code '를 꺼내고 두 개의'as'옵션을 다시 시도해도 작동하지 않습니다 : [see here] (https://i.imgur.com/4RuTXRX.png) –

+1

올바른 32 비트 바이너리 산출. 이제 우분투가 실행되지 않는 이유를 알아 내십시오. WSL을 사용하고 있습니까? 분명히 [32 비트를 지원하지 않습니다] (https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/13377507-please-add- 32-bit-elf-support-to-the-kernel)을 지원합니다. – Jester

답변

0

나는 당신의 어셈블러가 잘 작동하고 있다고 생각합니다. 설치된 glibc 버전과 링크하려면 i386 버전의 개발 패키지를 설치해야합니다 (배포 버전에 따라 libc6-dev:i386 일 수도 있지만 libc6-dev-i386 일 수 있음). 오른쪽으로 이동하려면 gcc -m32과 연결하십시오. 경로. 그러면 gcc 컴파일러 드라이버가 적절한 플래그로 ld을 호출합니다.

작은 C 파일을 컴파일하고 연결하여 작동 설정이되었는지 확인할 수 있습니다. gcc -m32. 이것은 32 비트 프로그램을 생성해야합니다.

+0

팁을 보내 주셔서 감사합니다. 문제 해결에 도움이 될 수 있습니다. libc6-dev : i386','libc6-dev-i386','gcc-multilib '의 최신 버전이 [image] (https://i.imgur.com/QvHSCEn.png)에서 보입니다. '이 이미 설치되어 있고 gcc 버전이 x86_64라고 생각합니다. 따라서 [이 C 예제] (http://www.geeksforgeeks.org/compile-32-bit-program-64-bit-gcc-cc/)를 사용하면 32 비트 컴파일에 대해 경고합니다 (잘못된 C 프로그램 또는 나쁜 32-하지만 gcc?)하지만 컴파일에는 문제가 없습니다. 내 gcc가 x86_64이기 때문에 그렇습니까? –

+0

@JaimeSalazar :이 코드를 Linux 용 Windows 하위 시스템 (Windows 10에서 사용할 수있는 Ubuntu)에서 실행하고 있습니까? –

+0

@JaimeSalazar WSL은 32 비트 바이너리를 실행할 수없는 것으로 보입니다. – fuz

관련 문제