2013-05-30 3 views
0

Я пытаюсь создать язык листинг ассемблера для простого привета мира программыLinker ошибка при компиляции сборка

Я побежал gcc -S file.c

и сгенерировал file.s.

Я использую ниже скрипт, используя .s файл генерируется:

#!/bin/bash -x 

NAME=file1 

for i in *.s; do 
     as -o ${i%.s}.o $i 
done 
ld -static -o $NAME *.o 
objdump -D $NAME 

Когда я использую это, я получаю сообщение об ошибке:

In function `main': 
(.text+0x16): undefined reference to `printf' 

Любая помощь будет принята с благодарностью.

+0

Вы не связываетесь со средой выполнения C, поэтому не можете найти функцию 'printf'. – DaoWen

+0

необходимо динамически динамически ссылаться на 'libc.so.6'. – 0x90

ответ

1

компилировать с gcc -fverbose-asm -S -Wall (и, возможно, также -O или -O2)

-fverbose-asm создает некоторые полезные комментарии в ассемблере.

Используйте gcc -v, чтобы понять, как связана программа. Вам нужен код запуска (например, crt0.o), и вам нужно связать libc.so.6 или libc.a как минимум.

При компиляции и связывании с gcc -v показаны промежуточные этапы и неявные объектные файлы и библиотеки. gcc только запускает другие программы, такие как cc1 (собственно компилятор) и as (ассемблер) и ld компоновщик. Иногда collect2 - это своего рода компоновщик.

BTW, вы можете написать код сборки и использовать его через gcc. Например, введите только одну процедуру в сборке, а остальные в C. Затем выполните команду gcc -v -Wall routine.s main.c -o prog

Также прочитайте также Linux Assembly HowTo.

+0

Спасибо Базиле и Даовен. Поскольку я новичок в языке c и кодировании, я смущен, где я должен добавить инструкцию ld .. это в файле сценария или мне нужно связать его вместе с gcc stament при создании файла .s? – stackuser

+0

Я предлагаю не писать полную программу в сборке. Код только одна процедура в сборке. И помните, что для реальных (даже небольших) программ оптимизационный компилятор работает лучше, чем вы можете. –

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