К оглавлению | |
1. Создадим проект gasrunparts для вставки в него кода ассемблера, взятого из статьи "Представления операндов в GAS."
1.1. Далее повторим все действия в соответствие с п.п. 1 и 2 статьи "Как использовать Build System GNU(Automake)" .
2. Затем, в корень проекта добавим статическую библиотеку libgasrunparts.a в соответствие с п.п. 4, 5 и 6 статьи "Build System GNU: Как собирать и cкомпилировать статическую библиотек"
2.1. Для чего, здесь в корне создадим директорию libgasrunparts .
user@debian:~/.../gas_runparts$ mkdir libgasrunparts 2.2. В ней создадим Makefile.am следующего содержания:
noinst_LIBRARIES = libgasrunparts.a libgasrunparts_a_SOURCES = inums_addition.s 2.3. Затем тут же создаем файл исходного кода inums_addition.s следующего содержания
# VARIABLES: haven't used. # description: this function is GAS example of addition operation by use variable-length data (8, 16 and 32 bits) # # .section .text .globl inums_addition .type inums_addition, @function inums_addition: pushl %ebp movl %esp, %ebp movb $1,%dl movzbl %dl,%edx movw $65535,%ax movzwl %ax,%eax addl %edx,%eax leave ret 2.4. Возвращаемся в корень проекта и в файле Makefile.am в переменной SUBDIRS добавляем дирикторию libgasrunparts.
SUBDIRS = src libgasrunparts dist_doc_DATA = README CHANGELOG INSTALL docsdir=docs dist_docs_DATA = docs/howto_use_build_system_gnu_with_assembly_code.odt 2.5. Оставаясь в корне проекта, включаем в файле configure.as макрос AM_PROG_AS, который должен быть указан, когда в проекте используется код ассемблера. Тем самым, будет выбран ассемблер и переменная CCAS, впрочем так же как CCASFLAGS. При этом, так же должен быть определен AM_PROG_СС, иначе ваш остальной проект, содержащий код Си, не будет собран. Так же в макросе AC_CONFIG_FILES не забываем прописать libgasrunparts/Makefile.am
AC_INIT([gas_runparts], [0.1], [rjaan@yandex.ru]) AM_INIT_AUTOMAKE([-Wall -Werror foreign ]) AC_CONFIG_MACRO_DIR([m4]) AC_PROG_CC AM_PROG_AS AC_PROG_RANLIB AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([ Makefile src/Makefile libgasrunparts/Makefile ]) AC_OUTPUT 3. Так как система автоматической сборки GNU считает, что наша библиотека линкуется как, не соответствующую стандарту POSIX
/usr/share/automake-1.14/am/library.am: warning: 'libgasrunparts.a': linking libraries using a non-POSIX /usr/share/automake-1.14/am/library.am: archiver requires 'AM_PROG_AR' in 'configure.ac' libgasrunparts/Makefile.am:4: while processing library 'libgasrunparts.a' autoreconf: automake failed with exit status: 1 3.1. В файле configure.as добавляем макрос AM_PROG_AR, как показано ниже
AC_INIT([gas_runparts], [0.1], [rjaan@yandex.ru]) AM_INIT_AUTOMAKE([-Wall -Werror foreign ]) AC_CONFIG_MACRO_DIR([m4]) AC_PROG_CC AM_PROG_AS m4_pattern_allow([AM_PROG_AR]) AM_PROG_AR AC_PROG_RANLIB AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([ Makefile src/Makefile libgasrunparts/Makefile ]) AC_OUTPUT 3.2. Установливаем пакет gnulib
root@debian:~# apt-get install gnulib 3.3. Обновляем генерацию конфигурационных файлов с копированием необходимых файлов
root@debian:~# autoreconf -v --install 4. Создание С-прототипа GAS-функции inums_addition
4.1. Находясь в корне проекта, создадим директорию include/gasrunparts, как показано ниже.
$ mkdir -p include/gasrunparts 4.2. В директории include создадим Makefile.am и определим правило сборки для заголовочных файлов исходного кода статической бибилиотеки libgasrunparts:
noinst_include_includedir = @includedir@/"libgasrunparts" noinst_include_HEADERS = \ gasrunparts/gasrunparts.h 4.3. Создадим заголовочный файл gasrunparts.h в директории include/gasrunparts c С-прототипом функции ассемблера GAS.
#ifndef __GASRUNPARTS_H__ #define __GASRUNPARTS_H__ 1 #ifdef __cplusplus extern "C" { #endif /*__cplusplus*/ /* * this function is GAS example of the addition operation by * use variable-length data (8, 16 and 32 bits) * */ unsigned int inums_addition (void); #ifdef __cplusplus } #endif /*__cplusplus*/ #endif /*__GASRUNPARTS_H__*/ В файле src/main.c нам останется только подключить данный заголовочный файл, как показано ниже.
. . . #include "gasrunparts/gasrunparts.h" . . . Так же в файле src/Makefile.am не забудте добавить переменные gasrunparts_CFLAGS и gasrunparts_LDADD
parser_srcs = parser.c parser.h bin_PROGRAMS = gasrunparts gasrunparts_SOURCES = main.c $(parser_srcs) gasrunparts_CFLAGS = -I$(top_srcdir)/include gasrunparts_LDADD = $(top_srcdir)/libgasrunparts/libgasrunparts.a 4.4. Затем в файле configure.ac, в макросе AC_CONFIG_FILES добавим создание Makefile в директории include
AC_INIT([gas_runparts], [0.1], [rjaan@yandex.ru]) AM_INIT_AUTOMAKE([-Wall -Werror foreign ]) AC_CONFIG_MACRO_DIR([m4]) AC_PROG_CC AM_PROG_AS m4_pattern_allow([AM_PROG_AR]) AM_PROG_AR AC_PROG_RANLIB AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([ Makefile src/Makefile include/Makefile libgasrunparts/Makefile ]) AC_OUTPUT 4.5. В корне проекта, в файле Makefile.am добавляем в переменную SUBDIRS директорию include.
SUBDIRS = src libgasrunparts include dist_doc_DATA = README CHANGELOG INSTALL docsdir=docs dist_docs_DATA = docs/howto_use_build_system_gnu_with_assembly_code.odt 4.6. Обновляем генерацию конфигурационных файлов с запуском автоматической сборки
root@debian:~# autoreconf -v --make Библиография 3) п.п. 1 и 2 статьи "Как использовать Build System GNU(Automake)"
4) п.п. 4, 5 и 6 статьи "Build System GNU: Как собирать и cкомпилировать статическую библиотек"
| |
К оглавлению |