2015-02-13 1 views
0

Я использую NASM для некоторых проектов в Windows. Я хотел бы назвать функцию printf C, но я не хочу, чтобы GCC со всем этим был burocracy, в результате мой небольшой проект (сборка на самом деле 30 строк) в разобранном 24000 строк. Как я могу сделать ссылку (получить функцию, которая будет вызвана в определениях системы, например MessageBox) без компоновщика?Как связать функции сборки без компоновщика?

Редактировать: Я сделал это с помощью дизассемблера. Смешно видеть, что почти все добавляет и nop.

0000000000402b90 <MessageBoxA>: 
    402b90: ff 25 2a 58 00 00  jmpq *0x582a(%rip)  # 4083c0 <__imp_MessageBoxA> 
    402b96: 90      nop 
    402b97: 90      nop 
    402b98: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 
    402b9f: 00 

и __imp_MessageBoxA:

00000000004083c0 <__imp_MessageBoxA>: 
    4083c0: 14 87     adc $0x87,%al 
    4083c2: 00 00     add %al,(%rax) 
    4083c4: 00 00     add %al,(%rax) 

Что это на самом деле?

+0

Получите меньший компоновщик? ;) – Jester

+0

@ Jester, это так глупо, я буквально рассмеялся: P Знаешь, я говорю о исполняемом коде, а не о компоновщике. –

+0

NASM может генерировать файлы .obj, которые могут быть связаны с инструментами сборки MS. Но мне вряд ли кажется, что компоновщик GCC не может делать то, что вы хотите, - если вы не используете Cygwin? (Если это так, попробуйте MinGW вместо этого.) –

ответ

0

Вы можете связать C-библиотеку вручную. используйте следующую команду на файл объект, полученный с NASM:

ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 objectfile -lc 

Над команды опробованы на 64-битных Linux, так что если вы хотите использовать его на окнах вы должны изменить /lib64/ld-linux-x86-64.so.2 в вашу динамическую библиотеку компоновщика обычно находите на C:/cygwin/lib/.., если вы используете cygwin и на C:/MingW/msys/1.0/lib64/ld-linux-x86-64.so.2, если вы используете MinGW.

+0

Это вообще не работает на MinGW. Пожалуйста, дайте нам версию Windows. –

+0

Я добавляю что-то для MinGW, надеюсь, это сработает. –

+0

@OP это фактически не работает. Нет никаких msys на моем MinGW (я использую MinGW-w64). –

Смежные вопросы