OSDev

для всех
Текущее время: 28 апр 2024, 20:21

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 11 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Sharing header
СообщениеДобавлено: 22 окт 2013, 19:20 

Зарегистрирован: 23 ноя 2012, 13:02
Сообщения: 27
Здравствуйте, у меня такой вопрос, можно ли расшарить хедер между сишным файлом и ассемблером?
В качестве ассемблера использую 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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Sharing header
СообщениеДобавлено: 22 окт 2013, 20:15 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Похоже, препроцессор некорректно обрабатывает ассемблерный файл и не выполняет подстановку. Может, ему знак доллара мешает?.. Попробуйте для интереса поставить пробел между долларом и именем макроса.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Sharing header
СообщениеДобавлено: 22 окт 2013, 20:48 

Зарегистрирован: 23 ноя 2012, 13:02
Сообщения: 27
Нет дело не в том стоит знак долара или нет, я пробовал и пробел вставлять и убирать его вовсе... Еще дело обстоит так, что если я переименую Файл на <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)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Sharing header
СообщениеДобавлено: 23 окт 2013, 00:08 

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Sharing header
СообщениеДобавлено: 23 окт 2013, 00:39 

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Sharing header
СообщениеДобавлено: 23 окт 2013, 10:30 

Зарегистрирован: 23 ноя 2012, 13:02
Сообщения: 27
С помощью 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?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Sharing header
СообщениеДобавлено: 23 окт 2013, 12:33 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Странно.


Последний раз редактировалось Himik 24 окт 2013, 23:20, всего редактировалось 4 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Sharing header
СообщениеДобавлено: 23 окт 2013, 20:38 

Зарегистрирован: 23 ноя 2012, 13:02
Сообщения: 27
Все разобрался... В общем, мало ли кому понадобится. Если у нас есть вот такой вот хедер:
Код:
#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 за помощь.


Последний раз редактировалось IlyaChur 24 окт 2013, 11:32, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Sharing header
СообщениеДобавлено: 23 окт 2013, 21:50 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
IlyaChur писал(а):
Код:
#include "test.h"

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Sharing header
СообщениеДобавлено: 24 окт 2013, 11:34 

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB