⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ld-lib.exp

📁 GNU binutils是GNU交叉工具链中的一个源码包
💻 EXP
📖 第 1 页 / 共 3 页
字号:
# Support routines for LD testsuite.#   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,#    2004, 2005 Free Software Foundation, Inc.## This file is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; either version 2 of the License, or# (at your option) any later version.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program; if not, write to the Free Software# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.### default_ld_version#	extract and print the version number of ld#proc default_ld_version { ld } {    global host_triplet    if { [which $ld] == 0 } then {	perror "$ld does not exist"	exit 1    }    catch "exec $ld --version" tmp    set tmp [prune_warnings $tmp]    regexp "\[^\n\]* (cygnus-|)(\[-0-9.a-zA-Z-\]+)\[\r\n\].*" $tmp version cyg number    if [info exists number] then {	clone_output "$ld $number\n"    }}## default_ld_relocate#	link an object using relocation#proc default_ld_relocate { ld target objects } {    global HOSTING_EMU    global host_triplet    if { [which $ld] == 0 } then {	perror "$ld does not exist"	return 0    }    verbose -log "$ld $HOSTING_EMU -o $target -r $objects"    catch "exec $ld $HOSTING_EMU -o $target -r $objects" exec_output    set exec_output [prune_warnings $exec_output]    if [string match "" $exec_output] then {	return 1    } else {	verbose -log "$exec_output"	return 0    }}# Check to see if ld is being invoked with a non-endian output formatproc is_endian_output_format { object_flags } {    if {[string match "*-oformat binary*" $object_flags] ||      \        [string match "*-oformat ieee*" $object_flags] ||        \	[string match "*-oformat ihex*" $object_flags] ||        \	[string match "*-oformat netbsd-core*" $object_flags] || \	[string match "*-oformat srec*" $object_flags] ||        \	[string match "*-oformat tekhex*" $object_flags] ||      \	[string match "*-oformat trad-core*" $object_flags] } then {        return 0    } else {	return 1    }}# Look for big-endian or little-endian switches in the multlib# options and translate these into a -EB or -EL switch.  Note# we cannot rely upon proc process_multilib_options to do this# for us because for some targets the compiler does not support# -EB/-EL but it does support -mbig-endian/-mlittle-endian, and# the site.exp file will include the switch "-mbig-endian"# (rather than "big-endian") which is not detected by proc# process_multilib_options.proc big_or_little_endian {} {    if [board_info [target_info name] exists multilib_flags] {	set tmp_flags " [board_info [target_info name] multilib_flags]"	foreach x $tmp_flags {	    case $x in {		{*big*endian eb EB -eb -EB -mb} {		    set flags " -EB"		    return $flags		}		{*little*endian el EL -el -EL -ml} {		    set flags " -EL"		    return $flags		}	    }	}    }    set flags ""    return $flags}## default_ld_link#	link a program using ld#proc default_ld_link { ld target objects } {    global HOSTING_EMU    global HOSTING_CRT0    global HOSTING_LIBS    global LIBS    global host_triplet    global link_output    set objs "$HOSTING_CRT0 $objects"    set libs "$LIBS $HOSTING_LIBS"    if { [which $ld] == 0 } then {	perror "$ld does not exist"	return 0    }    if [is_endian_output_format $objects] then {	set flags [big_or_little_endian]    } else {	set flags ""    }    verbose -log "$ld $HOSTING_EMU $flags -o $target $objs $libs"    catch "exec $ld $HOSTING_EMU $flags -o $target $objs $libs" link_output    set exec_output [prune_warnings $link_output]    if [string match "" $link_output] then {	return 1    } else {	verbose -log "$link_output"	return 0    }}## default_ld_simple_link#	link a program using ld, without including any libraries#proc default_ld_simple_link { ld target objects } {    global host_triplet    global link_output    global gcc_ld_flag    if { [which $ld] == 0 } then {	perror "$ld does not exist"	return 0    }    if [is_endian_output_format $objects] then {	set flags [big_or_little_endian]    } else {	set flags ""    }    # If we are compiling with gcc, we want to add gcc_ld_flag to    # flags.  Rather than determine this in some complex way, we guess    # based on the name of the compiler.    set ldexe $ld    set ldparm [string first " " $ld]    if { $ldparm > 0 } then {	set ldexe [string range $ld 0 $ldparm]    }    set ldexe [string replace $ldexe 0 [string last "/" $ldexe] ""]    if {[string match "*gcc*" $ldexe] || [string match "*++*" $ldexe]} then {	set flags "$gcc_ld_flag $flags"    }    verbose -log "$ld $flags -o $target $objects"    catch "exec $ld $flags -o $target $objects" link_output    set exec_output [prune_warnings $link_output]    # We don't care if we get a warning about a non-existent start    # symbol, since the default linker script might use ENTRY.    regsub -all "(^|\n)(\[^\n\]*: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output    if [string match "" $exec_output] then {	return 1    } else {	verbose -log "$exec_output"	return 0    }}## default_ld_compile#	compile an object using cc#proc default_ld_compile { cc source object } {    global CFLAGS    global srcdir    global subdir    global host_triplet    global gcc_gas_flag    set cc_prog $cc    if {[llength $cc_prog] > 1} then {	set cc_prog [lindex $cc_prog 0]    }    if {[which $cc_prog] == 0} then {	perror "$cc_prog does not exist"	return 0    }    catch "exec rm -f $object" exec_output    set flags "-I$srcdir/$subdir $CFLAGS"    # If we are compiling with gcc, we want to add gcc_gas_flag to    # flags.  Rather than determine this in some complex way, we guess    # based on the name of the compiler.    set ccexe $cc    set ccparm [string first " " $cc]    if { $ccparm > 0 } then {	set ccexe [string range $cc 0 $ccparm]    }    set ccexe [string replace $ccexe 0 [string last "/" $ccexe] ""]    if {[string match "*gcc*" $ccexe] || [string match "*++*" $ccexe]} then {	set flags "$gcc_gas_flag $flags"    }    if [board_info [target_info name] exists multilib_flags] {	append flags " [board_info [target_info name] multilib_flags]"    }    verbose -log "$cc $flags -c $source -o $object"    catch "exec $cc $flags -c $source -o $object" exec_output    set exec_output [prune_warnings $exec_output]    if [string match "" $exec_output] then {	if {![file exists $object]} then {	    regexp ".*/(\[^/\]*)$" $source all dobj	    regsub "\\.c" $dobj ".o" realobj	    verbose "looking for $realobj"	    if {[file exists $realobj]} then {		verbose -log "mv $realobj $object"		catch "exec mv $realobj $object" exec_output		set exec_output [prune_warnings $exec_output]		if {![string match "" $exec_output]} then {		    verbose -log "$exec_output"		    perror "could not move $realobj to $object"		    return 0		}	    } else {		perror "$object not found after compilation"		return 0	    }	}	return 1    } else {	verbose -log "$exec_output"	perror "$source: compilation failed"	return 0    }}## default_ld_assemble#	assemble a file#proc default_ld_assemble { as source object } {    global ASFLAGS    global host_triplet    if {[which $as] == 0} then {	perror "$as does not exist"	return 0    }    if ![info exists ASFLAGS] { set ASFLAGS "" }    set flags [big_or_little_endian]    verbose -log "$as $flags $ASFLAGS -o $object $source"    catch "exec $as $flags $ASFLAGS -o $object $source" exec_output    set exec_output [prune_warnings $exec_output]    if [string match "" $exec_output] then {	return 1    } else {	verbose -log "$exec_output"	perror "$source: assembly failed"	return 0    }}## default_ld_nm#	run nm on a file, putting the result in the array nm_output#proc default_ld_nm { nm nmflags object } {    global NMFLAGS    global nm_output    global host_triplet    if {[which $nm] == 0} then {	perror "$nm does not exist"	return 0    }    if {[info exists nm_output]} {      unset nm_output    }    if ![info exists NMFLAGS] { set NMFLAGS "" }    # Ensure consistent sorting of symbols    if {[info exists env(LC_ALL)]} {	set old_lc_all $env(LC_ALL)    }    set env(LC_ALL) "C"    verbose -log "$nm $NMFLAGS $nmflags $object >tmpdir/nm.out"    catch "exec $nm $NMFLAGS $nmflags $object >tmpdir/nm.out" exec_output    if {[info exists old_lc_all]} {	set env(LC_ALL) $old_lc_all    } else {	unset env(LC_ALL)    }    set exec_output [prune_warnings $exec_output]    if [string match "" $exec_output] then {	set file [open tmpdir/nm.out r]	while { [gets $file line] != -1 } {	    verbose "$line" 2	    if [regexp "^(\[0-9a-fA-F\]+) \[a-zA-Z0-9\] \\.*(.+)$" $line whole value name] {                set name [string trimleft $name "_"]		verbose "Setting nm_output($name) to 0x$value" 2		set nm_output($name) 0x$value	    }	}	close $file	return 1    } else {	verbose -log "$exec_output"	perror "$object: nm failed"	return 0    }}## is_elf_format#	true if the object format is known to be ELF#proc is_elf_format {} {    if { ![istarget *-*-sysv4*] \	 && ![istarget *-*-unixware*] \	 && ![istarget *-*-elf*] \	 && ![istarget *-*-eabi*] \	 && ![istarget hppa*64*-*-hpux*] \	 && ![istarget *-*-linux*] \	 && ![istarget frv-*-uclinux*] \	 && ![istarget *-*-irix5*] \	 && ![istarget *-*-irix6*] \	 && ![istarget *-*-netbsd*] \	 && ![istarget *-*-solaris2*] } {	return 0    }    if { [istarget *-*-linux*aout*] \	 || [istarget *-*-linux*oldld*] } {	return 0    }    if { ![istarget *-*-netbsdelf*] \	 && ([istarget *-*-netbsd*aout*] \	     || [istarget *-*-netbsdpe*] \	     || [istarget arm*-*-netbsd*] \	     || [istarget sparc-*-netbsd*] \	     || [istarget i*86-*-netbsd*] \	     || [istarget m68*-*-netbsd*] \	     || [istarget vax-*-netbsd*] \	     || [istarget ns32k-*-netbsd*]) } {    	return 0    }    return 1}## is_elf64#	true if the object format is known to be 64bit ELFproc is_elf64 { binary_file } {    global READELF    global READELFFLAGS    set readelf_size ""    catch "exec $READELF $READELFFLAGS -h $binary_file > readelf.out" got    if ![string match "" $got] then {	return 0    }    if { ![regexp "\n\[ \]*Class:\[ \]*ELF(\[0-9\]+)\n" \	   [file_contents readelf.out] nil readelf_size] } {	return 0    }    if { $readelf_size == "64" } {	return 1    }    return 0}## is_aout_format#	true if the object format is known to be aoutproc is_aout_format {} {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -