Как построить сборку x64 в OS X? - PullRequest
2 голосов
/ 26 июня 2009

Я пытаюсь собрать Hello World в сборке x64 на моем Leopard MacBook Pro. Он хорошо собирается, но я получаю эту ошибку при попытке связать его: ld: символ dyld_stub_binding_helper не определен (обычно в crt1.o / dylib1.o / bundle1.o) для предполагаемой архитектуры x86_64

Я загрузил его с помощью ld -o hello64 ​​hello64.o -lc

Мой ассемблер - Yasm.

РЕДАКТИРОВАТЬ: Насколько я могу судить, в отличие от 32-разрядного кода, вы должны предоставить хелпер-заглушку самостоятельно, и, поскольку я не знаю, как работает 64-битный хелпер-заглушку, я сделаю, как сказал Бастьен и GCC связывает его, так как он включает свой собственный помощник-заглушку.

Doh! ld включил бы crt1.o автоматически, если бы точка входа моей сборки была _main вместо _start.

Ответы [ 3 ]

5 голосов
/ 26 июня 2009

Вы не указали ассемблер. Лично я делал это до использования yasm ассемблера (и написал сообщение в этом отношении, но так как мой блог давно не работает, я не могу опубликовать ссылку). По сути, привет мир будет:

SECTION .data
   hello db 'hello, world', 10
   hellolen equ $ - hello

SECTION .text
   global start

start:
   mov rax, 0x2000004    ; sys_write
   mov rdi, 1            ; stdout 
   mov rsi, qword hello  ; string
   mov rdx, hellolen     ; length
   syscall
   mov rax, 0x2000001    ; sys_exit
   xor rdi, rdi          ; exit code
   syscall

В комплекте с:

yasm -f macho64 file.asm
ld a.o
./a.out
3 голосов
/ 26 июня 2009

Просто позвольте GCC обработать вызов компоновщика. Примерно так:

gcc hello64.o -o hello64

Ваш ассемблерный код, вероятно, должен будет определять символ main или, возможно, start.

[Изменить]

Причина, по которой я предлагаю это, состоит в том, что разные платформы вызывают компоновщик по-разному. Если вы увидите, какие аргументы GCC передает компоновщику с параметром командной строки --verbose, вы, вероятно, поймете, что он сложен и зависит от реализации.

0 голосов
/ 21 мая 2015

С YASM вы можете сделать:

yasm -f macho64 -a x86 main.asm -o main.o
ld main.o -o my_program
...