2011-08-05 7 views
9


Próbuję uruchomić podstawowy plik zespołu przy użyciu 64-bitowego Mac OS X Lion, używając nasm i ld, które są domyślnie instalowane z Xcode.Nie można połączyć pliku zestawu w systemie Mac OS X przy użyciu ld

Napisałem plik zespołu, który wypisuje postać, i mam ją do zbudowania przy użyciu nasm.

nasm -f elf -o program.o main.asm

Jednak, kiedy idę do łączenia go z LD, nie jest on z dość kilka błędów/ostrzeżeń:

ld -o program program.o

ld: warning: -arch not specified 
ld: warning: -macosx_version_min not specificed, assuming 10.7 
ld: warning: ignoring file program.o, file was built for unsupported file format which is not the architecture being linked (x86_64) 
ld: warning: symbol dyld_stub_binder not found, normally in libSystem.dylib 
ld: entry point (start) undefined. Usually in crt1.o for inferred architecture x86_64 

Więc starałem się naprawić kilka z tych problemów i nigdzie nie doszło.

Oto jedna z rzeczy Próbowałem:

ld -arch i386 -e _start -o program program.o

Które myślałem, że działa, ale myliłem się.

W jaki sposób uczynić plik obiektowy zgodną architekturą, z którą zgadzają się nasm i ld?

także, w jaki sposób określić punkt wejścia w programie (teraz używam global _start w .section text, co jest powyżej _start, które nie wydają się zrobić wiele dobrego.)

jestem trochę mylić, jak skutecznie połączyć plik obiektowy z plikiem binarnym za pomocą ld, i myślę, że po prostu brakuje mi jakiegoś kodu (lub argumentu do nasm lub ld), który sprawi, że się zgodzą.

Każda pomoc doceniona.

+0

Czy próbowałeś łączenie za pomocą gcc zamiast LD? Często jest o wiele łatwiej i można używać środowiska wykonawczego C i biblioteki standardowej (np. Jako punkt wejścia należy 'main'). Inną rzeczą do wypróbowania jest użycie formatu pliku obiektów 'mach' zamiast' elf'. – user786653

Odpowiedz

2

Najprawdopodobniej łatwiej jest pozwolić, aby gcc wykonał dla ciebie ciężkie podnoszenie, zamiast próbować bezpośrednio kierować ld, np.

$ gcc -m32 program.o -o program 
5

OK, patrząc na twoje próbki Zakładam, że użyłeś ogólnego poradnika montażu nasm lub linux.
Pierwszą rzeczą, którą trzeba się zająć, jest format binarny stworzony przez nasm.
Twoje stany post:

ld: warning: ignoring file program.o, file was built for unsupported file format which is not the architecture being linked (x86_64) 

Ów wyniku '-f elf' parametru który opowiada nasm chcesz obiekt 32bit ELF (co byłoby w przypadku na przykład Linux). Ale ponieważ jesteś na OSXie, potrzebujesz tylko obiektu Mach-O.

Spróbuj wykonać następujące czynności:

nasm -f macho64 -o program.o main.asm 
gcc -o program program.o 

Lub jeśli wa stworzyć binarny 32bit:

nasm -f macho32 -o program.o main.asm 
gcc -m32 -o program program.o 

Odnośnie _start symbolu - jeśli wan't utwórz prosty program, który będzie mógł korzystać z dostarczonych funkcji systemu libc, wtedy nie powinieneś używać _start w al. To domyślny punkt wejścia ld będzie szukać i normalnie jest podany w twoim libc/libsystem.

Proponuję spróbować zastąpić _start w kodzie coś jak „_MAIN” i połączyć go jak powyższym przykładzie państw.

Ogólny szablon montaż libc oparte na NASM może wyglądać następująco:

;--------------------------------------------------- 
.section text 
;--------------------------------------------------- 
use32    ; use64 if you create 64bit code 
global _main  ; export the symbol so ld can find it 

_main: 
    push ebp 
    mov ebp, esp ; create a basic stack frame 

    [your code here] 

    pop ebp  ; restore original stack 
    mov eax, 0 ; store the return code for main in eax 
    ret   ; exit the program 

Poza tym należy wspomnieć, że wszelkie połączeń „s zrobić na OSX należy użyć wyrównana ramka stosu lub twój kod po prostu się zawiesi.
Jest tam kilka dobrych samouczków - spróbuj poszukać przewodnika po OSX.

5

Należy użyć global start i start:, bez podkreślenia. Ponadto, nie powinno się używać elf jako łuku. Tutaj jest skrypt bash użyć do montażu moje x86-64 programy nasm na Mac OS X:

#!/bin/bash 

if [[ -n "$1" && -f "$1" ]]; then 
    filename="$1" 
    base="${filename%%.*}" 
    ext="${filename##*.}" 

    nasm -f macho64 -Ox "$filename" \ 
    && ld -macosx_version_min 10.7 "${base}.o" -o "$base" 
fi 

Jeśli masz plik o nazwie foo.s skrypt ten spowoduje uruchomienie

nasm -f macho64 -Ox foo.s 

co stworzy foo.o. Flaga -Ox sprawia, że ​​NASM dokonuje dodatkowej optymalizacji za pomocą skoków (to znaczy, że są krótkie, bliskie lub dalekie), więc nie musisz tego robić samodzielnie. Używam x86-64, więc mój kod jest 64-bitowy, ale wygląda na to, że próbujesz zainstalować 32-bit. W takim przypadku użyjesz -f macho32. Zobacz nasm -hf, aby uzyskać listę prawidłowych formatów wyjściowych.

Teraz plik obiekt zostanie połączony:

ld -macosx_version_min 10.7 foo.o -o foo 

mam ustawić opcję -macosx_version_min uspokoić NASM dół i zapobiec ostrzeżenie. Nie musisz ustawić go na Lion (10.7). Spowoduje to utworzenie pliku wykonywalnego o nazwie foo. Przy odrobinie szczęścia wpisanie ./foo i naciśnięcie return powinno uruchomić twój program.

Jeśli chodzi o ostrzeżenie ld: warning: symbol dyld_stub_binder not found, normally in libSystem.dylib, otrzymuję to za każdym razem i nie jestem pewien dlaczego, ale wszystko wydaje się w porządku, gdy uruchamiam plik wykonywalny.

Powiązane problemy