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 |
Да согласен описочка вышла, в коде то все правильно, просто код у меня был на одной машине, а сообщение я вручную набирал с другой, вот и перепутал не проверив ![]() |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |