MinGW проблемы линковки си-шного файл + асмовский
От: Losar Россия  
Дата: 03.04.13 09:37
Оценка:
Привет.

Почему не линкуется такая конструкция:

Есть файл foo.S
.global foo
.data
.text
foo:
    movl 4(%esp), %eax
    imull %eax, %eax
    ret


и main.c
#include <stdio.h>

int foo(int);

int main()
{
    int sum = foo(100);
    printf("%d", sum); // sum = 3, x = 1, y = 2
    return 0;
}


Собираю:
gcc main.c foo.S

Но линкер не находит функцию foo
main.c.text+0x16): undefined reference to `foo'

Чего не хватает ему?

Спасибо.
Re: MinGW проблемы линковки си-шного файл + асмовский
От: watch-maker  
Дата: 03.04.13 10:25
Оценка:
Здравствуйте, Losar, Вы писали:

L>Но линкер не находит функцию foo

L>main.c:(.text+0x16): undefined reference to `foo'

L>Чего не хватает ему?


Это всё проклятый name mangling.
Есть пара приемлемых способов исправить это:

В теории ещё можно задействовать опасные опции компилятора вроде -fno-leading-underscore, но даже если они помогут тут, это приведёт к более серьёзным проблемам, так как нарушит ABI.
Re[2]: MinGW проблемы линковки си-шного файл + асмовский
От: Losar Россия  
Дата: 03.04.13 10:32
Оценка:
Здравствуйте, watch-maker, Вы писали:

WM>Здравствуйте, Losar, Вы писали:


L>>Но линкер не находит функцию foo

L>>main.c.text+0x16): undefined reference to `foo'

L>>Чего не хватает ему?


WM>Это всё проклятый name mangling.

WM>Есть пара приемлемых способов исправить это:
WM>
WM>В теории ещё можно задействовать опасные опции компилятора вроде -fno-leading-underscore, но даже если они помогут тут, это приведёт к более серьёзным проблемам, так как нарушит ABI.


Спасибо за советы, буду смотреть.
Re: MinGW проблемы линковки си-шного файл + асмовский
От: saf_e  
Дата: 03.04.13 10:50
Оценка:
Здравствуйте, Losar, Вы писали:

L>Привет.


L>Почему не линкуется такая конструкция:


L>Есть файл foo.S

L>
L>.global foo
L>.data
L>.text
L>foo:
L>    movl 4(%esp), %eax
L>    imull %eax, %eax
L>    ret
L>


L>Но линкер не находит функцию foo

L>main.c.text+0x16): undefined reference to `foo'
L>Чего не хватает ему?
L>Спасибо.

Думаю дело в том, что вы не объявляете ваш символ публичным.
Лучше всего оформить это дело в виде процедуры:

foo proc PUBLIC
    ret
foo endp


Ассемблер не имеет манглинга, и выставляет такое имя которое вы укажете, например: ?swap@@YIKK@Z
Поэтому если вы видите, что С не находит символ просто копируете эту строчку и подставляете вместо имени
Ну и не забывайте про call-conventions.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.