ld error 问题继续
接着我在2010-08-28发出的问题,到现在还没有解决。
自己试着debug LD,发现在bfd/format.c:line 173 (binutils2.1。“right_targ = BFD_SEND_FMT (abfd, _bfd_check_format, (abfd));”给的结果不对。
.#define BFD_SEND_FMT(bfd, message, arglist)
. (((bfd)->xvec->message[(int) ((bfd)->format)]) arglist)。
可以看出,bfd_target->_bfd_check_format 执行有问题。
但要想查bfd_target->_bfd_check_format 的具体函数,到现在还没有查出。库的文件格式应该是elf32-i386。但就是查不到。
不知这里是否有高人指点?
说实在,我真不知道什么原因,并且没有怀疑我编译的库有问题。有什么办法呢?
谢谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
更多
发布评论
评论(9)
你好:
"其中bfd_elf32_object_p和bfd_elf32_core_file_p也不太容易找,它们对应的是elf_object_p和elf_core_file_p (elfcode.h)"
应该是
g++ -v -o $tmpdir/cduicc-g
-B/usr/local/binutils-2.18/bin -fopenmp -rdynamic
-g -m32
objpath/libobj-g.a
编译程序的时候加上-v,这样才能显示具体传给ld的参数。
1.
搜索得到
grep -n -r bfd_elf32_object_p *
bfd/elf32-target.h:781: bfd_elf32_object_p, /* assembler/linker output (object file) */
bfd/elf32-target.h:877: bfd_elf32_object_p, /* assembler/linker output (object file) */
Binary file bfd/elf32-gen.o matches
Binary file bfd/.libs/libbfd.a matches
bfd/elf-bfd.h:1841:extern const bfd_target *bfd_elf32_object_p
bfd_elf32_object_p究竟在哪里被定义的呢?
2.
编译binutils时,我用的default配置,加--prefix==指定目录。
这有什么不妥吗?
3.
“你应该使用g++ -v ...来查看collect2运行时候的选项,然后执行collect2的时候,再加上-v,来查看ld的选项”
但是我得到
./gcc-4.2.2-static/bin/g++ -v
Using built-in specs.
Target: i386-redhat-linux
Configured with: ../../src/gcc-4.2.2/configure --prefix=/usr/gcc-4.2.2-static --disable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-languages=c,c++,objc,fortran --with-cpu=generic --host=i386-redhat-linux
Thread model: posix
gcc version 4.2.2。
可否说得具体一些。
谢谢你们
感觉你的ld不认识archive format嘛,你编译binutils时怎么配置的?
你好, target函数在elf32-target.h
里面有两个
const bfd_target TARGET_LITTLE_SYM ={}
const bfd_target TARGET_BIG_SYM ={}
然后你要找的bfd_check_format 是在
/* bfd_check_format: check the format of a file being read */
{ _bfd_dummy_target, /* unknown format */
bfd_elf32_object_p, /* assembler/linker output (object file) */
bfd_elf32_archive_p, /* an archive */
bfd_elf32_core_file_p /* a core file */
},
这几个成员中,具体根据你要检查是哪个类型的文件,然后选择对应的函数。
其中bfd_elf32_object_p和bfd_elf32_core_file_p也不太容易找,它们对应的是elf_object_p和elf_core_file_p (elfcode.h)
n多年前读过LD, 现在忘干净了。
> 2. 我也不知道ld运行时的具体arguments,即使用--verbose,arguments也没有显示出来。
-Xlinker --verbose 是用来将选项传给ld。你应该使用g++ -v ...来查看collect2运行时候的选项,然后执行collect2的时候,再加上-v,来查看ld的选项。
用的命令和选项:
g++ -Xlinker --verbose -o $tmpdir/cduicc-g
-B/usr/local/binutils-2.18/bin -fopenmp -rdynamic
-g -m32
objpath/libobj-g.a
... ...
用的using internal linker script。
GNU ld (GNU Binutils) 2.18
Supported emulations:
elf_i386
i386linux
using internal linker script:
==================================================
/* Script for -z combreloc: combine and sort reloc sections */
OUTPUT_FORMAT("elf32-i386", "elf32-i386",
"elf32-i386"
OUTPUT_ARCH(i386)
ENTRY(_start)
SEARCH_DIR("/usr/local/binutils-2.18/i686-pc-linux-gnu/lib"; SEARCH_DIR("/usr/local/binutils-2.18/lib"; SEARCH_DIR("/usr/local/lib"; SEARCH_DIR("/lib"; SEARCH_DIR("/usr/lib";
SECTIONS
{
/* Read-only sections, merged into text segment: */
PROVIDE (__executable_start = 0x08048000); . = 0x08048000 + SIZEOF_HEADERS;
.interp : { *(.interp) }
.note.gnu.build-id : { *(.note.gnu.build-id) }
.hash : { *(.hash) }
.gnu.hash : { *(.gnu.hash) }
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }
.gnu.version : { *(.gnu.version) }
.gnu.version_d : { *(.gnu.version_d) }
.gnu.version_r : { *(.gnu.version_r) }
.rel.dyn :
{
*(.rel.init)
*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
*(.rel.fini)
*(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
*(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*)
*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
*(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
*(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
*(.rel.ctors)
*(.rel.dtors)
*(.rel.got)
*(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
}
.rela.dyn :
{
*(.rela.init)
*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
*(.rela.fini)
*(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
*(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
*(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
*(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
*(.rela.ctors)
*(.rela.dtors)
*(.rela.got)
*(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
}
.rel.plt : { *(.rel.plt) }
.rela.plt : { *(.rela.plt) }
.init :
{
KEEP (*(.init))
} =0x90909090
.plt : { *(.plt) }
.text :
{
*(.text .stub .text.* .gnu.linkonce.t.*)
KEEP (*(.text.*personality*))
/* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning)
} =0x90909090
.fini :
{
KEEP (*(.fini))
} =0x90909090
PROVIDE (__etext = .);
PROVIDE (_etext = .);
PROVIDE (etext = .);
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
.rodata1 : { *(.rodata1) }
.eh_frame_hdr : { *(.eh_frame_hdr) }
.eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) }
.gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
/* Adjust the address for the data segment. We want to adjust up to
the same address within the page on the next page up. */
. = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE) - 1)); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));
/* Exception handling */
.eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) }
.gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
/* Thread Local Storage sections */
.tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
.tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
.preinit_array :
{
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP (*(.preinit_array))
PROVIDE_HIDDEN (__preinit_array_end = .);
}
.init_array :
{
PROVIDE_HIDDEN (__init_array_start = .);
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
PROVIDE_HIDDEN (__init_array_end = .);
}
.fini_array :
{
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP (*(.fini_array))
KEEP (*(SORT(.fini_array.*)))
PROVIDE_HIDDEN (__fini_array_end = .);
}
.ctors :
{
/* gcc uses crtbegin.o to find the start of
the constructors, so we make sure it is
first. Because this is a wildcard, it
doesn't matter if the user does not
actually link against crtbegin.o; the
linker won't look for a file to match a
wildcard. The wildcard also means that it
doesn't matter which directory crtbegin.o
is in. */
KEEP (*crtbegin.o(.ctors))
KEEP (*crtbegin?.o(.ctors))
/* We don't want to include the .ctor section from
the crtend.o file until after the sorted ctors.
The .ctor section from the crtend file contains the
end of ctors marker and it must be last */
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
}
.dtors :
{
KEEP (*crtbegin.o(.dtors))
KEEP (*crtbegin?.o(.dtors))
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*(.dtors))
}
.jcr : { KEEP (*(.jcr)) }
.data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) }
.dynamic : { *(.dynamic) }
.got : { *(.got) }
. = DATA_SEGMENT_RELRO_END (12, .);
.got.plt : { *(.got.plt) }
.data :
{
*(.data .data.* .gnu.linkonce.d.*)
KEEP (*(.gnu.linkonce.d.*personality*))
SORT(CONSTRUCTORS)
}
.data1 : { *(.data1) }
_edata = .; PROVIDE (edata = .);
__bss_start = .;
.bss :
{
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(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. */
. = ALIGN(. != 0 ? 32 / 8 : 1);
}
. = ALIGN(32 / ;
. = ALIGN(32 / ;
_end = .; PROVIDE (end = .);
. = DATA_SEGMENT_END (.);
/* 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 .gnu.linkonce.wi.*) }
.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) }
.gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) }
}
因程序大,大约要一个半小时以后,会出现类似如下的信息:
..、../obj/lib-linux/libjobs-g.a: could not read symbols: File format not recognized
collect2: ld returned 1 exit status
请问:
1. 怎么设断点?因为 --
2. 我也不知道ld运行时的具体arguments,即使用--verbose,arguments也没有显示出来。
谢谢!
你的静态库的名字是什么?编译链接选项是什么?
ld是用-O0 -g编译的么?
在bfd_target->_bfd_check_format之前设断点,然后单步进去,查不到这个钩子对应的具体函数么?