2012-03-21 2 views
1

(Запуск MinGW на 64-битной ОС Windows 7 и GCC на Kubuntu)Проблем с вызовом функции сборки из C

Это может возможно быть просто проблема MingW, но это не удалось, по крайней мере, одну установка Kubuntu, а также , поэтому я сомневаюсь.

У меня есть короткая, простая программа на C, которая должна вызвать функцию сборки. Я скомпилирую ассемблер с помощью nasm и c-программы, используя MingW-реализацию gcc. Эти два связаны вместе с makefile - bog-simple. И тем не менее, связь не может по иску требование о том, что внешняя функция является «неопределенная ссылка»

Соответствующая часть Makefile:

assign0: ass0.o main.o 
gcc -v -m32 -g -Wall -o assign0 ass0.o main.o 


    main.o: main.c 
     gcc -g -c -Wall -m32 -o main.o main.c 

    ass0.o: ass0.s 
    nasm -g -f elf -w+all -o ass0.o ass0.s 

Начало файла сборки:

section .data      ; data section, read-write 
    an: DD 0     ; this is a temporary var 

section .text      ; our code is always in the .text section 
    global do_str    ; makes the function appear in global scope 
    extern printf    

do_str:        ; functions are defined as labels 
[Just Code] 

И декларация с файла:

extern int do_str(char* a); 

Это работало, по крайней мере, один Kubuntu установка, сбой на другой, и не удалось выполнить MingW. У кого-нибудь есть идея?

+2

Иногда символ '_' добавляется к символьным именам. Какое точное сообщение об ошибке вы получаете? –

+0

Возможный дубликат [Добавление подчеркивания подчеркивания в символы сборки с помощью GCC на Win32?] (Http://stackoverflow.com/questions/1034852/adding-leading-underscores-to-assembly-symbols-with-gcc-on-win32) –

+0

Вы пробовали обмен файлами {ass0.o main.o} в командной строке компоновщика? – wildplasser

ответ

2

Компиляторы C могут вызывать действительную «функцию» по-разному, например. _do_str вместо do_str. Невозможность изменения имени всегда может зависеть от системы (и, конечно же, от компилятора). Попробуйте вызвать функцию asm _do_str. Использование правильного attributes (в gcc) также может устранить проблему. Также read this.

4

... утверждение о том, что внешняя функция является 'неопределенная ссылка'

LOL! Линкеры не претендуют на ложь. Вы не будете убедить изменить его разум, настаивая на том, что вы правы или это неправильно. Примите то, что инструменты говорят вам, чтобы быть правдой без задержек. Это ключ к быстрому выявлению проблемы.

Почти каждый компилятор C, включая те, которые вы используете, генерирует глобальные символы с префиксом подчеркивания для минимизации конфликтов имен с символами языка ассемблера. Например, изменить код

extern _printf 
... 
call _printf 

и сообщения об ошибках о printf быть неопределенным уйдут. Если вы do получите неопределенную ссылку на _printf, это связано с тем, что компоновщик не имеет доступа к библиотеке времени выполнения C. Команде ссылок может быть сложно получить правильное решение. Обычно это не очень учебное, так что кроватка из рабочего проекта, или искать пример. Это способ, которым IDE очень полезны.

Что касается коды C вызывающей функцию сборки, как правило, проще всего написать функцию сборки с использованием условности языка C:

global _do_str 

_do_str: 

В качестве альтернативы, вы можете объявить функцию использовать Паскаль соглашение о вызовах:

Соглашение о вызове Pascal существенно отличается от C: оно не добавляет к символу ведущее подчеркивание, вызывающий отвечает за удаление параметров после возврата, а параметры находятся в другом порядке, возможно с некоторыми типами данных параметров, которые передаются в регистрах, а не в стеке. См. Ссылки на компиляторы для всех деталей.

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