ubuntu x86-64位機器下編譯32位彙編的問題
示例程式碼:
# movtest3.s
.section .data
output:
.asciz "The value is %d\n"
values:
.int 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60
.section .text
.globl _start
_start:
nop
movl $0, %edi
loop:
movl values(, %edi, 4), %eax
pushl %eax
pushl $output
call printf
addl $8, %esp
inc %edi
cmpl $11, %edi
jne loop
movl $0, %ebx
movl $1, %eax
int $0x80
彙編:as --32 movtest3.s -o movtest3.o
連結:ld -o movtest3 movtest3.o -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -L/lib/i386-linux-gnu -lc
當中可能會碰到的幾個問題:
如果提示"invalid instruction suffix for `push'",是因為彙編時沒有用--32來指定按32位來編譯;
如果不加-m elf_i386指定基於32位平臺連結,會報錯:ld: i386 架構於輸入檔案 movtest3.o 與 i386:x86-64 輸出不相容;
如果提示"對‘printf’未定義的引用",是因為連結時沒有指定C庫;
如果提示"ld: 找不到 -lc",則可能是C庫路徑不對或軟連結問題,先通過locate libc.so查詢本機c庫的路徑,比如我的電腦查詢結果如下:
/lib/i386-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so
一般通過路徑名就能區分32位和64位,如果想進一步確認,可以通過file命令檢視.
$ file /lib/i386-linux-gnu/libc.so.6
/lib/i386-linux-gnu/libc.so.6: symbolic link to libc-2.23.so // libc.so.6是一個軟連結
$ file /lib/i386-linux-gnu/libc-2.23.so
/lib/i386-linux-gnu/libc-2.23.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux.so.2, BuildID[sha1]=dd5192a769e33ed6ca68a6ab5740ff9e8ec678a7, for GNU/Linux 2.6.32, stripped
我的電腦沒有libc.so這個軟連結,在/lib/i386-linux-gnu/目錄下,執行sudo ln -sf libc.so.6 libc.so,再次連結,通過.
相關文章
- Architecture 1001: x86-64 Assembly 彙編
- 淺談彙編器、編譯器和直譯器編譯
- Ubuntu 18.04(虛擬機器)環境下編譯Android 原始碼Ubuntu虛擬機編譯Android原始碼
- Linux下C語言編譯的問題LinuxC語言編譯
- Python 的編譯器geany-1.36無法下載問題Python編譯
- libmemcached編譯問題IBM編譯
- SPI編譯問題編譯
- VLC在ubuntu環境下編譯編譯
- Ubuntu 15.04編譯Android 6.0.1原始碼-Nexus5真機編譯Ubuntu編譯Android原始碼
- Kaldi在ubuntu 18.04下編譯小結Ubuntu編譯
- Ubuntu中 MySQL 的中文編碼問題UbuntuMySql
- 【問題記錄】—.NetCore 編譯問題NetCore編譯
- go的編譯優化問題Go編譯優化
- nginx 編譯出現的問題Nginx編譯
- Ubuntu16.04編譯VIORB過程中遇到的問題 尤其是rosbag的問題Ubuntu編譯ORBROS
- GCC編譯過程(預處理->編譯->彙編->連結)GC編譯
- ubuntu編譯grpc & protobufUbuntu編譯RPC
- vmware ubuntu虛擬機器問題彙總解決Ubuntu虛擬機
- Ubuntu上的pycrypto給出了編譯器錯誤Ubuntu編譯
- 虛擬機器-Linux開發板交叉編譯問題記錄虛擬機Linux編譯
- CUDA常見編譯器配置問題一覽編譯
- ubuntu16.04下MATLAB和C++混編(基於ROS,不含VS類別的編譯器)UbuntuMatlabC++ROS編譯
- 64位內聯彙編
- 配置pycharm 編譯器時遇到的一些問題PyCharm編譯
- 一個nvcc編譯的小問題編譯
- CMake編譯Qt工程時的問題編譯QT
- 編譯、彙編、連結、載入、顯示編譯
- Java 反彙編、反編譯、volitale解讀Java編譯
- iOS逆向之旅(基礎篇) — 彙編(五) — 彙編下的BlockiOSBloC
- 自制編譯器——cbc安裝後使用出問題編譯
- Android編譯通過,執行編譯錯誤問題總結Android編譯
- 編譯器的自展和自舉、交叉編譯編譯
- Gradle 編譯警告亂碼問題Gradle編譯
- iOS逆向之旅(基礎篇) — 彙編(四) — 彙編下的函式iOS函式
- iOS逆向之旅(基礎篇) — 彙編(二) — 彙編下的 IF語句iOS
- Ubuntu 16 04 編譯 Caffe SSDUbuntu編譯
- ubuntu編譯安裝pcl教程。Ubuntu編譯
- ubuntu編譯安裝kernel教程。Ubuntu編譯