The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

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

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.

 

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