Как использовать систему автоматической сборки GNU c кодом ассемблера


 К оглавлению
  
 
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

Библиография

 
 
 
  
 К оглавлению


Сайт создан в системе uCoz