10.7.2 Создание совместно используемых библиотек для uClinux

Предыдущая  Содержание  Следующая V*D*V

Совместно используемые библиотеки в uClinux представляют собой обычные файлы bFLT, созданные с помощью специальных флагов компилятора. Флаги компилятора помогают определить символьные ссылки с помощью фиксированного числа ID библиотеки. Шаги, необходимые для создания и использования разделяемых библиотек, перечислены ниже. В этом примере, чтобы создать общую библиотеку libtest, мы используем a.c и b.c.

 

Файл: a.c

 

void a()

{

  printf("I am a\n");

}

 

Файл: b.c

 

void b()

{

  printf("I am b\n");

}

 

Компилируем каждый файл. Обратите внимание, что используется флаг -mid-sharedlibrary.
 
m68k-elf-gcc -Wall -Wstrict-prototypes -Wno-trigraphs
-fno-strict-aliasing -Os -g -fomit-frame-pointer
-m68000 -fno-common -Wall -fno-builtin -DEMBED
-mid-shared-library -nostdinc
-I/home/sriramn/work/uclinux/uClinux-dist/include
-I/home/sriramn/work/uclinux/uClinux-dist/include/include
-Dlinux -D__linux__ -D__uClinux__ -Dunix -msoft-float
-fno-builtin a.c -c -o a.o
m68k-elf-gcc -Wall -Wstrict-prototypes -Wno-trigraphs
-fno-strict-aliasing -Os -g -fomit-frame-pointer -m68000
-fno-common -Wall -fno-builtin -DEMBED -mid-shared-library -
nostdinc -I/home/sriramn/work/uclinux/uClinux-dist/include
-I/home/sriramn/work/uclinux/uClinux-dist/include/include
-Dlinux -D__linux__ -D__uClinux__ -Dunix -msoft-float
-fno-builtin b.c -c -o b.o
 

Создаём архив.
 
m68k-elf-ar r libtest.a a.o b.o
m68k-elf-ranlib libtest.a
 

Создаём двоичный файл типа "flat" с необходимым идентификатором библиотеки (здесь мы используем 2, libc имеет id =1). Обратите внимание на добавление файла uClibc/lib/main.o для пустой функции main и опцию -shared-lib-id=2.
 
m68k-elf-gcc -nostartfiles -o libtest -Os -g
-fomit-frame-pointer -m68000 -fno-common -Wall
-fno-builtin -DEMBED -mid-shared-library -nostdinc
-I/home/sriramn/work/uclinux/uClinux-dist/include
-I/home/sriramn/work/uclinux/uClinux-dist/include/include
-Dlinux -D__linux__ -D__uClinux__ -Dunix -Wl,-elf2flt
-nostdlib -Wl,-shared-lib-id,2
/home/sriramn/work/uclinux/uClinux-dist/uClibc/lib/main.o
-Wl,-R,/home/sriramn/work/uclinux/uClinux-dist/lib/libc.gdb
-lc –lgcc -Wl,--whole-archive,libtest.a,--no-whole-archive
 

Удаляем символы запуска. Так как должна быть возможность использовать библиотеку с другим приложением, символы запуска,  добавляемые через среду исполнения языка Си, такие как _main, _start и тому подобные, должны быть удалены. Это делается с помощью следующей команды.
 
m68k-elf-objcopy -L _GLOBAL_OFFSET_Table_ -L main -L __main
-L _start -L __uClibc_main -L __uClibc_start_main
-L lib_main -L _exit_dummy_ref
-L __do_global_dtors -L __do_global_ctors
-L __CTOR_LIST__ -L __DTOR_LIST__
-L _current_shared_library_a5_offset_
libtest.gdb
 

Устанавливаем эту библиотеку в rootfs под соответствующим именем.
 
cp libtest.gdb romfs/lib/lib2.so

 

 

Чтобы проанализировать созданные символы, выполним для этого символьного файла nm.

 

#nm libtest.gdb | sort

  0100001c A __assert

  01000098 A isalnum

  010000b8 A isalpha

  010000d8 A isascii

    …

    …

  010355c4 A __ti19__pointer_type_info

  010355d0 A __ti16__ptmd_type_info

  010355dc A __ti19__builtin_type_info

  020000cc T a

  020000e4 T b

  02000100 D __data_start

  02000100 D data_start

 

Обратите внимание на наличие символов 01xxxxxx из libc (lib1.so) и символы нашей библиотеки lib2.so, начинающиеся с 02xxxxxx.

 

Предыдущая  Содержание  Следующая