2017-01-13 6 views
1

Мы видим ниже ошибку компоновщика с gcc, что указывает эта ошибка. Имеет ли он какое-либо отношение к файлу определения компоновщика?Ошибка компоновщика за пределами глобального текстового сегмента

ERROR: found static function _ZNSt8_Rb_treeIjSt4pairIKjP11BFD_SESSIONESt10_Select1stIS4_ESt4lessIjESaIS4_EE14_M_lower_boundEPSt13_Rb_tree_nodeIS4_ESD_RS1_$isra$84 outside of the global text segment 
ERROR: (perhaps you marked a static function as hot?) 

Linker скрипт ниже ->

/* Script for ld -r: link without relocation */ 
OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", 
      "elf64-x86-64") 
OUTPUT_ARCH(i386:x86-64) 
    /* For some reason, the Solaris linker makes bad executables 
    if gld -r is used and the intermediate file has sections starting 
    at non-zero addresses. Could be a Solaris ld bug, could be a GNU ld 
    bug. But for now assigning the zero vmas works. */ 
SECTIONS 
{ 
    /* Read-only sections, merged into text segment: */ 
    .interp  0 : { *(.interp) } 
    .note.gnu.build-id : { *(.note.gnu.build-id) } 
    .hash   0 : { *(.hash) } 
    .gnu.hash  0 : { *(.gnu.hash) } 
    .dynsym  0 : { *(.dynsym) } 
    .dynstr  0 : { *(.dynstr) } 
    .gnu.version 0 : { *(.gnu.version) } 
    .gnu.version_d 0: { *(.gnu.version_d) } 
    .gnu.version_r 0: { *(.gnu.version_r) } 
    .rela.init 0 : { *(.rela.init) } 
    .rela.text 0 : { *(.rela.text) } 
    .rela.fini 0 : { *(.rela.fini) } 
    .rela.rodata 0 : { *(.rela.rodata) } 
    .rela.data.rel.ro 0 : { *(.rela.data.rel.ro) } 
    .rela.data 0 : { *(.rela.data) } 
    .rela.tdata 0 : { *(.rela.tdata) } 
    .rela.tbss 0 : { *(.rela.tbss) } 
    .rela.ctors 0 : { *(.rela.ctors) } 
    .rela.dtors 0 : { *(.rela.dtors) } 
    .rela.got  0 : { *(.rela.got) } 
    .rela.bss  0 : { *(.rela.bss) } 
    .rela.ldata 0 : { *(.rela.ldata) } 
    .rela.lbss 0 : { *(.rela.lbss) } 
    .rela.lrodata 0 : { *(.rela.lrodata) } 
    .rela.ifunc 0 : { *(.rela.ifunc) } 
    .rela.plt  0 : 
    { 
     *(.rela.plt) 
    } 
    .init   0 : 
    { 
    KEEP (*(SORT_NONE(.init))) 
    } 
    .plt   0 : { *(.plt) *(.iplt) } 
    .hot   0 : { *(.text.hot) } 
    .text   0 : 
    { 
    /* merge .text.* sections into the .text segment in the first pass link 
     so that all static functions are in the same segment and the relative 
     offsets reported by nm/readelf can be used to determine the final 
     absolute address of the function in the image. */ 
    *(.text .stub .text.* .gnu.linkonce.t.*) 
    /* .gnu.warning sections are handled specially by elf32.em. */ 
    *(.gnu.warning) 
    } 
    .fini   0 : 
    { 
    KEEP (*(SORT_NONE(.fini))) 
    } 
.rodata  0 : { *(.rodata) } 
    .rodata1  0 : { *(.rodata1) } 
    .eh_frame_hdr : { *(.eh_frame_hdr) } 
    .eh_frame  0 : ONLY_IF_RO { KEEP (*(.eh_frame)) } 
    .gcc_except_table 0 : ONLY_IF_RO { *(.gcc_except_table 
    .gcc_except_table.*) } 
    /* These sections are generated by the Sun/Oracle C++ compiler. */ 
    .exception_ranges 0 : ONLY_IF_RO { *(.exception_ranges 
    .exception_ranges*) } 
    /* Adjust the address for the data segment. We want to adjust up to 
     the same address within the page on the next page up. */ 
    /* Exception handling */ 
    .eh_frame  0 : ONLY_IF_RW { KEEP (*(.eh_frame)) } 
    .gcc_except_table 0 : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } 
    .exception_ranges 0 : ONLY_IF_RW { *(.exception_ranges .exception_ranges*) } 
    /* Thread Local Storage sections */ 
    .tdata 0 : { *(.tdata) } 
    .tbss  0 : { *(.tbss) } 
    .preinit_array 0 : 
    { 
    KEEP (*(.preinit_array)) 
    } 
    .jcr   0 : { KEEP (*(.jcr)) } 
    .dynamic  0 : { *(.dynamic) } 
    .got   0 : { *(.got) *(.igot) } 
    .got.plt  0 : { *(.got.plt) *(.igot.plt) } 
    .data   0 : 
    { 
    *(.data) 
    } 
    .data1  0 : { *(.data1) } 
    .bss   0 : 
    { 
    *(.dynbss) 
    *(.bss) 
    *(COMMON) 
    /* Align here to ensure that the .bss section occupies space up to 
     _end. Align after .bss to ensure correct alignment even if the 
     .bss section disappears because there are no input sections. 
     FIXME: Why do we need it? When there is no .bss section, we don't 
     pad the .data section. */ 
    } 
    .lbss 0 : 
    { 
    *(.dynlbss) 
    *(.lbss) 
    *(LARGE_COMMON) 
    } 
    .lrodata 0 : 
    { 
    *(.lrodata) 
    } 
    .ldata 0 : 
    { 
    *(.ldata) 
    } 
    /* Stabs debugging sections. */ 
    .stab   0 : { *(.stab) } 
    .stabstr  0 : { *(.stabstr) } 
    .stab.excl  0 : { *(.stab.excl) } 
    .stab.exclstr 0 : { *(.stab.exclstr) } 
    .stab.index 0 : { *(.stab.index) } 
    .stab.indexstr 0 : { *(.stab.indexstr) } 
    .comment  0 : { *(.comment) } 
    /* DWARF debug sections. 
     Symbols in the DWARF debugging sections are relative to the beginning 
     of the section so we begin them at 0. */ 
    /* DWARF 1 */ 
    .debug   0 : { *(.debug) } 
    .line   0 : { *(.line) } 
    /* GNU DWARF 1 extensions */ 
    .debug_srcinfo 0 : { *(.debug_srcinfo) } 
    .debug_sfnames 0 : { *(.debug_sfnames) } 
    /* DWARF 1.1 and DWARF 2 */ 
    .debug_aranges 0 : { *(.debug_aranges) } 
    .debug_pubnames 0 : { *(.debug_pubnames) } 
    /* DWARF 2 */ 
    .debug_info  0 : { *(.debug_info) } 
    .debug_abbrev 0 : { *(.debug_abbrev) } 
    .debug_line  0 : { *(.debug_line) } 
    .debug_frame 0 : { *(.debug_frame) } 
    .debug_str  0 : { *(.debug_str) } 
    .debug_loc  0 : { *(.debug_loc) } 
    .debug_macinfo 0 : { *(.debug_macinfo) } 
    /* SGI/MIPS DWARF 2 extensions */ 
    .debug_weaknames 0 : { *(.debug_weaknames) } 
    .debug_funcnames 0 : { *(.debug_funcnames) } 
    .debug_typenames 0 : { *(.debug_typenames) } 
    .debug_varnames 0 : { *(.debug_varnames) } 
    /* DWARF 3 */ 
    .debug_pubtypes 0 : { *(.debug_pubtypes) } 
    .debug_ranges 0 : { *(.debug_ranges) } 
    /* DWARF Extension. */ 
    .debug_macro 0 : { *(.debug_macro) } 
    .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) } 
} 

From the linker script we find that .text.* i.e all section with any suffix after .text.* is placed under .text section. We find that certain functions are suffixed to .text.xxxx as unique section names. We dont find the compiler option "-function-sections" in our compilation steps. 

Отрывок из objdump -----> OBJS/bfdproto/x86_64/bfdp_proto.o: формат файла elf64-x86-64

SYMBOL TABLE: 
    0000000000000000 l df *ABS* 0000000000000000 bfdp_proto.cpp 
    0000000000000000 l d .text 0000000000000000 .text 
    0000000000000000 l d .data 0000000000000000 .data 
    0000000000000000 l d .bss 0000000000000000 .bss 
    0000000000000000 l d .text._ZNSt8_Rb_treeIjSt4pairIKjP11BFD_SESSIONESt10_Select1stIS4_ESt4lessIjESaIS4_EE14_M_lower_boundEPSt13_Rb_tree_nodeIS4_ESD_RS1_$isra$84 0000000000000000 .text._ZNSt8_Rb_treeIjSt4pairIKjP11BFD_SESSIONESt10_Select1stIS4_ESt4lessIjESaIS4_EE14_M_lower_boundEPSt13_Rb_tree_nodeIS4_ESD_RS1_$isra$84 
    0000000000000000 l  F .text._ZNSt8_Rb_treeIjSt4pairIKjP11BFD_SESSIONESt10_Select1stIS4_ESt4lessIjESaIS4_EE14_M_lower_boundEPSt13_Rb_tree_nodeIS4_ESD_RS1_$isra$84 000000000000002c __ZNSt8_Rb_treeIjSt4pairIKjP11BFD_SESSIONESt10_Select1stIS4_ESt4lessIjESaIS4_EE14_M_lower_boundEPSt13_Rb_tree_nodeIS4_ESD_RS1_$isra$84 
    0000000000000000 l d .text._ZNSt8_Rb_treeI14BFD_RXINFO_KEYSt4pairIKS0_P11BFD_SESSIONESt10_Select1stIS5_ESt4lessIS0_ESaIS5_EE14_M_lower_boundEPSt13_Rb_tree_nodeIS5_ESE_RS2_$isra$87 0000000000000000 .text._ZNSt8_Rb_treeI14BFD_RXINFO_KEYSt4pairIKS0_P11BFD_SESSIONESt10_Select1stIS5_ESt4lessIS0_ESaIS5_EE14_M_lower_boundEPSt13_Rb_tree_nodeIS5_ESE_RS2_$isra$87 
    0000000000000000 l  F .text._ZNSt8_Rb_treeI14BFD_RXINFO_KEYSt4pairIKS0_P11BFD_SESSIONESt10_Select1stIS5_ESt4lessIS0_ESaIS5_EE14_M_lower_boundEPSt13_Rb_tree_nodeIS5_ESE_RS2_$isra$87 000000000000004a __ZNSt8_Rb_treeI14BFD_RXINFO_KEYSt4pairIKS0_P11BFD_SESSIONESt10_Select1stIS5_ESt4lessIS0_ESaIS5_EE14_M_lower_boundEPSt13_Rb_tree_nodeIS5_ESE_RS2_$isra$87 
    0000000000000180 l  F .text 0000000000000029 __ZNSt4listIP11BFD_SESSIONSaIS1_EE5eraseESt14_List_iteratorIS1_E$isra$92 
    00000000000001b0 l  F .text 000000000000006b __ZNSt4listIP11BFD_SESSIONSaIS1_EE6insertESt14_List_iteratorIS1_ERKS1_$isra$90 
    0000000000000000 l d .rodata.str1.1 0000000000000000 .rodata.str1.1 
    0000000000000000 l d .rodata.str1.8 0000000000000000 .rodata.str1.8 
    0000000000000000 l d .text.unlikely 0000000000000000 .text.unlikely 
    0000000000000000 l  F .text.unlikely 000000000000012e _tr_util_write_v4_trace$constprop$126 
    0000000000000620 l  O .rodata  0000000000000017 __ZZ22tr_util_write_v4_traceE12__FUNCTION__ 
    0000000000000710 l  O .rodata  000000000000000d __ZZN13BFD_ALLOCATORnwEmE12__FUNCTION__ 
    0000000000000000 l d .gcc_except_table  0000000000000000 .gcc_except_table 
    0000000000000700 l  O .rodata  0000000000000010 __ZZN13BFD_ALLOCATORdlEPvmE12__FUNCTION__ 
    00000000000006f0 l  O .rodata  0000000000000010 __ZZN13BFD_ALLOCATORdlEPvE12__FUNCTION__ 
    00000000000006d0 l  O .rodata  0000000000000013 __ZZN13BFD_ALLOCATORdaEPvE12__FUNCTION__ 
    00000000000006c0 l  O .rodata  0000000000000010 __ZZN13BFD_ALLOCATORdlEPvRKSt9nothrow_tE12__FUNCTION__ 
    00000000000006a0 l  O .rodata  0000000000000013 __ZZN13BFD_ALLOCATORdaEPvRKSt9nothrow_tE12__FUNCTION__ 
    0000000000000000 l d 

ответ

0

Эта ошибка, кажется, указывает, что компоновщик нашел скомпилированный код в function вне глобального Text segment. Однако это незаконно. Все инструкции программы должны быть встроены внутри Text segment.

Не могли бы предоставить нам более подробную информацию о вашем процессе компиляции/связывания?

+0

Отрывок из объекта дампа внизу. – gsat

+0

Из сценария компоновщика мы находим, что .text. * Вся секция с любым суффиксом после .text. * Помещается в раздел .text. Мы обнаруживаем, что некоторые функции суффиктируются в .text.xxxx как уникальные имена разделов. Мы не находим параметр компилятора «-function-sections» в наших этапах компиляции. – gsat

+0

Обложка Objdump вставлена ​​сверху. – gsat

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

  • Нет связанных вопросов^_^