OSDev
http://osdev.su/

Sharing header
http://osdev.su/viewtopic.php?f=6&t=811
Страница 1 из 2

Автор:  IlyaChur [ 22 окт 2013, 19:20 ]
Заголовок сообщения:  Sharing header

Здравствуйте, у меня такой вопрос, можно ли расшарить хедер между сишным файлом и ассемблером?
В качестве ассемблера использую GAS, компилятор для сишного кода естественно GCC.
Имею следующее:
test_asm.s
Код:
#include "test.h"

.global     tst_func1
tst_func1:
    push    %ebp
    pushf
   
    mov $TEST_DEF1, %ecx
   
    pop     %ebp
    popf
    ret


Вот файл test.h:
Код:
#ifndef __TEST_H__
#define __TEST_H__

#define TEST_DEF1    1

#endif


При компиляции в момент линковки выскакивает вот такая ошибка:
Код:
src/test/test_asm.o: In function `tst_func1':
(.text+0x3): undefined reference to `TEST_DEF1'


Я пробовал изменить строчку где объявляется хедер с #include "test.h" на .include "test.h", но в таком случае выскакивает ошибка чтения:
Код:
src/test/test_asm.s:13: Error: can't open test.h for reading: No such file or directory

Помогите, пожалуйста, может кто-нибудь уже сталкивался с подобной проблемой?

Автор:  SII [ 22 окт 2013, 20:15 ]
Заголовок сообщения:  Re: Sharing header

Похоже, препроцессор некорректно обрабатывает ассемблерный файл и не выполняет подстановку. Может, ему знак доллара мешает?.. Попробуйте для интереса поставить пробел между долларом и именем макроса.

Пы.Сы. Я ГНУсным асмом не пользуюсь, да и Си на дух не переношу, так что это так, предположения.

Автор:  IlyaChur [ 22 окт 2013, 20:48 ]
Заголовок сообщения:  Re: Sharing header

Нет дело не в том стоит знак долара или нет, я пробовал и пробел вставлять и убирать его вовсе... Еще дело обстоит так, что если я переименую Файл на <name>.S он мне все правильно слинкует... Но будет ошибки на push/pop, потому что он будет пробовать собирать этот файл для 64 битной архитектуры.
Вот вырезки из Makefile:
Код:
$(GCCPREFIX) =
AS  := $(GCCPREFIX)as
ASFLAG = --32 -I $(INC_DIR)
...
%.o: %.s
   @echo "======================================================================="
   @echo $@ $<
   @echo "======================================================================="
   $(AS) $(ASFLAG) -c -o $@ $<
   @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
...
%.o: %.S
   @echo "======================================================================="
   @echo $@ $<
   @echo "======================================================================="
   $(AS) $(ASFLAG) -c -o $@ $<
   @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
...


Но еще мне кажется, что когда я переименовываю файл и меняю расширение с *.s на *.S ассемблеровский файл компилируется с помощью gcc а не с помощью as... Потому что появляется вот такое сообщение:
Код:
linking src/test/test_asm.o (gcc)

Автор:  Himik [ 23 окт 2013, 00:08 ]
Заголовок сообщения:  Re: Sharing header

Я думаю, что нужно задать расширение .S и компилировать с помощью 32-битного gcc, он называется i686-gnu-linux-gcc. Можно ещё попробовать для 64-битного gcc поставить параметр -m32. И для gcc тоже нужно ставить параметр -c чтоб не линковалось.

PS На другую тему. Я заметил, что gcc версии 4.8 компилирует сишные файлы в 2 раза быстрее, чем 4.7.

Автор:  Nable [ 23 окт 2013, 00:39 ]
Заголовок сообщения:  Re: Sharing header

> Можно ещё попробовать для 64-битного gcc поставить параметр -32
-m32, насколько помню.
> Я заметил, что gcc версии 4.8 компилирует сишные файлы в 2-3 раза быстрее, чем 4.7.
Разгребают старые завалы кода, разгребают. Кстати, это с каким уровнем оптимизации сравнивалось?
Кстати, регресс в GCC 4.7 (да и в 4.6) - штука известная. Ну ничего, расчистят ещё. Да и clang вполне юзабелен нынче.

Upd: ну вот, опередил.

Upd2:
> Я думаю, что нужно задать расширение .S и компилировать с помощью 32-битного gcc
Плюсуюсь тут, тоже так делаю. Правда, платформа не x86, но это сути не меняет.

Автор:  IlyaChur [ 23 окт 2013, 10:30 ]
Заголовок сообщения:  Re: Sharing header

С помощью i686-gnu-linux-gcc компилировать не пробовал - вечером попробую, пока не могу.
Я понимаю что надо компилировать с флагом -m32, но даже если я пропишу в Makefile так:
Код:
...
CC  := $(GCCPREFIX)gcc
...
CFLAGS = -m32 -I$(INC_DIR) -Wfatal-errors -nostdlib -nostdinc -fno-builtin -fno-stack-protector
...
%.o: %.S
        @echo "======================================================================="
        @echo $@ $<
        @echo "======================================================================="
        $(CC) $(CFLAGS ) -c -o $@ $<
        @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"


Он все-равно компилирует для 64 битной платформы. Потому что появляются ошибки с push/pop, если их исправить - ld говорит, что неможет слинковать файл, так как у него архитектура не i386. Как-нибудь по другому можно передать флаги для gcc?

Автор:  Himik [ 23 окт 2013, 12:33 ]
Заголовок сообщения:  Re: Sharing header

Странно.

Автор:  IlyaChur [ 23 окт 2013, 20:38 ]
Заголовок сообщения:  Re: Sharing header

Все разобрался... В общем, мало ли кому понадобится. Если у нас есть вот такой вот хедер:
Код:
#ifndef __TEST_H__
#define __TEST_H__

#define TEST_DEF1    1

#endif

Нам надо получить значение переменной из ассемблеровского файла. Надо иметь ассемблеровский файл с расширением .S (как в винде не знаю, а в линуксе это принципиально), не знаю почему, но если файл будет с расширением .s будет выдана ошибка, что TEST_DEF1 неизвестная переменная.
Теперь привожу пример ассемблеровского файла (test_asm.S):
Код:
#include "test.h"

.global     tst_func1
tst_func1:
    push    %ebp
    pushf
   
    mov $TEST_DEF1, %ecx
   
    popf
    pop     %ebp
    ret


В итоге в ecx будет лежать значение TEST_DEF1.
Для компиляции использовался такой Makefile:
Код:
GCCPREFIX =
CC  := $(GCCPREFIX)gcc
CFLAGS = -m32 -I$(INC_DIR) -Wfatal-errors -nostdlib -nostdinc -fno-builtin -fno-stack-protector
...
%.o: %.S
  $(CC) $(CFLAGS) -c -o $@ $<
...


Спасибо большое Himik и Nable за помощь.

Автор:  Himik [ 23 окт 2013, 21:50 ]
Заголовок сообщения:  Re: Sharing header

IlyaChur писал(а):
Код:
#include "test.h"

.global     tst_func1
tst_func1:
    push    %ebp
    pushf
   
    mov $TEST_DEF1, %ecx
   
    pop     %ebp
    popf
    ret

После такой комбинации, флаги и ebp обменяются значениями. Это же стек! :-)
Ассемблер заставляет человека думать как машина. Постепенно он низводит уровень мышления до машинного уровня. Советую всячески его избегать.

Автор:  IlyaChur [ 24 окт 2013, 11:34 ]
Заголовок сообщения:  Re: Sharing header

Да согласен описочка вышла, в коде то все правильно, просто код у меня был на одной машине, а сообщение я вручную набирал с другой, вот и перепутал не проверив :D

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/