Fix some AVR test failures.
[deliverable/binutils-gdb.git] / gdb / testsuite / lib / gdb.exp
index 4e5c89b0f8733b9feeabddc456678451258e539b..5a5a8fb403c5a0ce69768357af5f08b28e05b53b 100644 (file)
@@ -3369,12 +3369,10 @@ proc gdb_compile {source dest type options} {
         }
     }
 
-    # We typically link to shared libraries using an absolute path, and
-    # that's how they are found at runtime.  If we are going to
-    # dynamically load one by basename, we must specify rpath.  If we
-    # are using a remote host, DejaGNU will link to the shared library
-    # using a relative path, so again we must specify an rpath.
-    if { $shlib_load || ($shlib_found && [is_remote target]) } {
+    # Because we link with libraries using their basename, we may need
+    # (depending on the platform) to set a special rpath value, to allow
+    # the executable to find the libraries it depends on.
+    if { $shlib_load || $shlib_found } {
        if { ([istarget "*-*-mingw*"]
              || [istarget *-*-cygwin*]
              || [istarget *-*-pe*]) } {
@@ -3555,6 +3553,9 @@ proc gdb_compile_shlib {sources dest options} {
                 lappend obj_options "additional_flags=-fpic"
             }
         }
+        "icc-*" {
+                lappend obj_options "additional_flags=-fpic"
+        }
         default {
            # don't know what the compiler is...
         }
@@ -3585,14 +3586,16 @@ proc gdb_compile_shlib {sources dest options} {
                set name ${dest}
            }
            lappend link_options "additional_flags=-Wl,--out-implib,${name}.a"
-       } elseif [is_remote target] {
-           # By default, we do not set the soname.  This causes the linker
-           # on ELF systems to create a DT_NEEDED entry in the executable
-           # refering to the full path name of the library.  This is a
-           # problem in remote testing if the library is in a different
-           # directory there.  To fix this, we set a soname of just the
-           # base filename for the library, and add an appropriate -rpath
-           # to the main executable (in gdb_compile).
+       } else {
+           # Set the soname of the library.  This causes the linker on ELF
+           # systems to create the DT_NEEDED entry in the executable referring
+           # to the soname of the library, and not its absolute path.  This
+           # (using the absolute path) would be problem when testing on a
+           # remote target.
+           #
+           # In conjunction with setting the soname, we add the special
+           # rpath=$ORIGIN value when building the executable, so that it's
+           # able to find the library in its own directory.
            set destbase [file tail $dest]
            lappend link_options "additional_flags=-Wl,-soname,$destbase"
        }
@@ -4211,8 +4214,13 @@ proc gdb_remote_download {dest fromfile {tofile {}}} {
 
        return $destname
     } else {
-       # When the DEST is local, we copy the file to the test directory
-       # (where the executable is), except if that's already where it is.
+       # When the DEST is local, we copy the file to the test directory (where
+       # the executable is).
+       #
+       # Note that we pass TOFILE through standard_output_file, regardless of
+       # whether it is absolute or relative, because we don't want the tests
+       # to be able to write outside their standard output directory.
+
        set tofile [standard_output_file $tofile]
 
        file copy -force $fromfile $tofile
@@ -4221,22 +4229,24 @@ proc gdb_remote_download {dest fromfile {tofile {}}} {
     }
 }
 
-# gdb_load_shlibs LIB...
+# gdb_load_shlib LIB...
 #
-# Copy the listed libraries to the target.
+# Copy the listed library to the target.
 
-proc gdb_load_shlibs { args } {
-    if {![is_remote target]} {
-       return
-    }
+proc gdb_load_shlib { file } {
+    set dest [gdb_remote_download target [shlib_target_file $file]]
 
-    foreach file $args {
-       gdb_remote_download target [shlib_target_file $file]
+    if {[is_remote target]} {
+       # If the target is remote, we need to tell gdb where to find the
+       # libraries.
+       #
+       # We could set this even when not testing remotely, but a user
+       # generally won't set it unless necessary.  In order to make the tests
+       # more like the real-life scenarios, we don't set it for local testing.
+       gdb_test "set solib-search-path [file dirname $file]" "" ""
     }
 
-    # Even if the target supplies full paths for shared libraries,
-    # they may not be paths for this system.
-    gdb_test "set solib-search-path [file dirname [lindex $args 0]]" "" ""
+    return $dest
 }
 
 #
This page took 0.026057 seconds and 4 git commands to generate.