2016-11-15 9 views
-1

На самом деле я пишу общий загрузчик объектов, который загружается с помощью gcc-созданных общих объектов (ELF) на контроллере cortex-m4. Загрузка, обработка зависимостей и перемещение и т. Д. Отлично работают. Но общий объект имеет некоторые странные символы в разделе .dynsym, которые я не знаю, как обращаться.общий объект на странных символах Cortex-M4 в разделе dynsym

readelf --dyn-SYM libfoo.so

Num: Wert Size Typ  Bind Vis  Ndx Name                              
0: 00000000  0 NOTYPE LOCAL DEFAULT UND                                
1: 000005c8  0 SECTION LOCAL DEFAULT 8                                
2: 00000874  0 SECTION LOCAL DEFAULT 16                                
3: 00000000  0 NOTYPE GLOBAL DEFAULT UND printf                              
4: 0000082d 32 FUNC GLOBAL DEFAULT 12 foo3                              
5: 0000087c  0 NOTYPE GLOBAL DEFAULT 18 __bss_start__                            
6: 00000000  0 NOTYPE GLOBAL DEFAULT UND __libc_init_array                           
7: 00000728  0 NOTYPE GLOBAL DEFAULT 12 _mainCRTStartup                            
8: 000005c8  0 FUNC GLOBAL DEFAULT 8 _init                              
9: 00000000  0 NOTYPE GLOBAL DEFAULT UND __libc_fini_array                           
10: 00000000  0 NOTYPE WEAK DEFAULT UND __deregister_frame_info                          
11: 00000000  0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable                         
12: 00000898  0 NOTYPE GLOBAL DEFAULT 18 __bss_end__                             
13: 00000728  0 NOTYPE GLOBAL DEFAULT 12 _start                              
14: 00000000  0 NOTYPE WEAK DEFAULT UND software_init_hook                           
15: 00000000  0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTab                         
16: 00000000  0 NOTYPE GLOBAL DEFAULT UND memset                              
17: 00000000  0 NOTYPE GLOBAL DEFAULT UND main                              
18: 00000000  0 NOTYPE WEAK DEFAULT UND hardware_init_hook                           
19: 000005e0  0 FUNC GLOBAL DEFAULT 9 _fini                              
20: 00000000  0 NOTYPE GLOBAL DEFAULT UND atexit                              
21: 00000000  0 NOTYPE WEAK DEFAULT UND __stack                              
22: 00000000  0 NOTYPE GLOBAL DEFAULT UND exit                              
23: 00000000  0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses                           
24: 00000000  0 NOTYPE WEAK DEFAULT UND __register_frame_info 

Почему общий объект нужна ссылка на основной-функции и к __libc_init_array функции? Особенно символ __libc_init_array не имеет для меня никакого смысла ... Эта функция normaly инициализирует __preinit_array, _init и __init_array, но это задание должно выполняться моим загрузчиком не самим объектом, либо я ошибаюсь?

Есть ли пошаговая документация по инициализации загруженного совместно используемого объекта со всеми его зависимостями?

Это путь, как я строю мой общий-объект:

gcc -std=gnu99 -W -Wall -Wstrict-prototypes -Wmissing-prototypes -ffunction-sections -fdata-sections -mfloat-abi=soft -mcpu=cortex-m4 -mthumb -mlong-calls -Os -g -c -fPIC -o foo.o foo.c 

gcc -shared -fPIC -Wl,-soname,libfoo.so -T./shared.ld -o libfoo.so foo.o 

Существует еще один вопрос: Без опции -mlong-вызовы, мой НКУ генерирует недопустимый опкод в разделе .plt .. что я делаю неправильно?

EDIT: Мой foo.c Верри просто:

#include <stdio.h> 
#include <string.h> 

void foo3 (void) 
{ 
    printf("Hello from shared-object"); 
} 

Это мой shared.ld:

OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") 

OUTPUT_ARCH(arm) 

SECTIONS 
{ 
    .interp   : { *(.interp) } 
    .note.ABI-tag : { *(.note.ABI-tag) } 

    .gnu.version : { *(.gnu.version) } 
    .gnu.version_d : { *(.gnu.version_d) } 
    .gnu.version_r : { *(.gnu.version_r) } 

    .dynamic  : { *(.dynamic) } 

    .hash   : { *(.hash) } 
    .dynsym   : { *(.dynsym) } 
    .dynstr   : { *(.dynstr) } 

    .rel.dyn  : { *(.rel.dyn) } 
    .rela.dyn  : { *(.rela.dyn) } 
    .rel.plt  : { *(.rel.plt) } 
    .rela.plt  : { *(.rela.plt) } 

    .plt   : { *(.plt) } 
    .got   : { *(.got.plt) *(.got) } 

    .init ALIGN(32/8) : 
    { 
     KEEP (*(.init)) 
    } 

    .fini ALIGN(32/8) : 
    { 
     KEEP (*(.fini)) 
    } 

    .preinit_array ALIGN(32/8) : 
    { 
     PROVIDE(__preinit_array_start = .); 
     KEEP (*(.preinit_array)) 
     PROVIDE(__preinit_array_end = .); 
    } 

    .init_array ALIGN(32/8) : 
    { 
     PROVIDE(__init_array_start = .); 
     KEEP (*(.init_array*)) 
     PROVIDE(__init_array_end = .); 
    } 

    .fini_array ALIGN(32/8) : 
    { 
     PROVIDE(__fini_array_start = .); 
     KEEP (*(.fini_array*)) 
     PROVIDE(__fini_array_end = .); 
    } 

    .text ALIGN(32/8) : 
    { 
     *(.text .text.*) 
    } 

    .rodata ALIGN(32/8) : 
    { 
     *(.rodata .rodata.*) 
    } 

    .data ALIGN(32/8) : 
    { 
     *(.data .data.*) 
    } 

    .bss ALIGN(32/8) : 
    { 
     PROVIDE(__bss_start__ = .); 

     *(.bss .bss.*) 
     *(COMMON) 

     PROVIDE(__bss_end__ = .); 
    } 
} 

ВНИМАНИЕ: Ссылка на Printf установлен к printf моей основной программы в linktime - только для testingpurpose.

Спасибо за помощь :-)

+0

Это поможет, если вы также предоставили (обрезанный) код для foo.c и shared.ld. – yugr

+0

«Без опции -mlong-calls мой gcc генерирует недопустимый код операции в разделе .plt ... что я делаю неправильно?» - если это воспроизводится в последних binutils, вы должны [указать ошибку] ​​(https://sourceware.org/bugzilla/). – yugr

+0

Интересно, может ли ваша toolchain создавать общие библиотеки. Не могли бы вы проверить предложения в http://stackoverflow.com/questions/18586291/could-not-build-shared-library-using-toolchain-arm-uclinuxeabi? – yugr

ответ

0

Я решил первую проблему! -nostartfiles был моим другом :-)

gcc -std=gnu99 -W -Wall -Wstrict-prototypes -Wmissing-prototypes -ffunction-sections -fdata-sections -mfloat-abi=soft -mcpu=cortex-m4 -mthumb -mlong-calls -Os -g -c -fPIC -o foo.o foo.c 

gcc -shared -fPIC -nostartfiles -mfloat-abi=soft -mcpu=cortex-m4 -mthumb -Wl,-soname,libfoo.so -T./shared.ld -o libfoo.so foo.o 

без всякой информации crtxxx, библиотека теперь чистая!

проблема с недействительным кодом операции по-прежнему существует, но я использую gcc в версии 4.7.4, поэтому эта «ошибка» может быть исправлена ​​сегодня.

Смежные вопросы