struct type *type = builtin_type (gdbarch)->builtin_unsigned_short;
   ULONGEST value;
 
-  if (address == 0)
-    return;
-
   /* Swallow errors.  */
   if (target_read_memory (address, bytes, TYPE_LENGTH (type)) != 0)
     {
 void
 stap_probe::set_semaphore (struct objfile *objfile, struct gdbarch *gdbarch)
 {
+  if (m_sem_addr == 0)
+    return;
   stap_modify_semaphore (relocate_address (m_sem_addr, objfile), 1, gdbarch);
 }
 
 void
 stap_probe::clear_semaphore (struct objfile *objfile, struct gdbarch *gdbarch)
 {
+  if (m_sem_addr == 0)
+    return;
   stap_modify_semaphore (relocate_address (m_sem_addr, objfile), 0, gdbarch);
 }
 
 
+2020-01-10  George Barrett  <bob@bob131.so>
+
+       * gdb.base/stap-probe.c (relocation_marker): Add dummy variable
+       to help in finding the image relocation offset.
+       * gdb.base/stap-probe.exp (stap_test): Accept arbitrary compile
+       options in arguments.
+       (stap_test_no_debuginfo): Likewise.
+       (stap-probe-nosem-noopt-pie, stap-probe-nosem-noopt-nopie): Add
+       test variants.
+       (stap_test): Add null semaphore relocation test.
+
 2020-01-10  George Barrett  <bob@bob131.so>
 
        * gdb.base/stap-probe.c: Rename USE_PROBES to USE_SEMAPHORES.
 
 # Run the tests.  We run the tests two different ways: once with a
 # plain probe, and once with a probe that has an associated semaphore.
 # This returns -1 on failure to compile or start, 0 otherwise.
-proc stap_test {exec_name {arg ""}} {
+proc stap_test {exec_name {args ""}} {
     global testfile hex srcfile
 
     if {[prepare_for_testing "failed to prepare" ${exec_name} $srcfile \
-          [concat additional_flags=$arg debug]]} {
+          [concat $args debug]]} {
        return -1
     }
 
+    set semaphore_addr_var ""
+    if {[string first "-DUSE_SEMAPHORES" $args] == -1} {
+       gdb_test_no_output "set breakpoint always-inserted on"
+       set semaphore_addr_var [get_hexadecimal_valueof "&relocation_marker" "0"]
+    }
+
     if ![runto_main] {
        return -1
     }
     gdb_test "print \$_probe_argc" "No probe at PC $hex" \
        "check argument not at probe point"
 
-    if {[string first "-DUSE_SEMAPHORES" $arg] != -1} {
+    if {[string first "-DUSE_SEMAPHORES" $args] != -1} {
        gdb_test "info probes stap" \
            "test *user *$hex *$hex .*"
     } else {
        fail "run to -pstap test:user"
     }
 
+    if {[string first "-DUSE_SEMAPHORES" $args] == -1} {
+       set relocation_base \
+          [expr [get_hexadecimal_valueof "&relocation_marker" "0"] - $semaphore_addr_var]
+       if {$relocation_base != 0} {
+          # Checks that GDB doesn't mistakenly relocate and write to null
+          # semaphore addresses.  If it were to relocate a zero-valued
+          # semaphore address and increment the value at that address, we
+          # would expect to see "\200ELF" here instead.
+          gdb_test "p (*(char*) $relocation_base)@4" \
+               " = \"\\\\177ELF\"" \
+               "null semaphore relocation"
+       }
+    }
+
     # Test probe arguments.
     gdb_test "print \$_probe_argc" " = 1" \
     "print \$_probe_argc for probe user"
     return 0
 }
 
-proc stap_test_no_debuginfo {exec_name {arg ""}} {
+proc stap_test_no_debuginfo {exec_name {args ""}} {
     global testfile hex
 
     if {[prepare_for_testing "failed to prepare" ${exec_name} ${testfile}.c \
-          [concat additional_flags=$arg nodebug optimize=-O2]]} {
+          [concat $args nodebug optimize=-O2]]} {
        return -1
     }
 
        untested "stap probe test failed"
          return -1
     }
+
+    foreach_with_prefix pie { "nopie" "pie" } {
+       stap_test "stap-probe-nosem-noopt-$pie" $pie
+    }
 }
 
 with_test_prefix "with semaphore, not optimized" {
-    stap_test "stap-probe-sem-noopt" "-DUSE_SEMAPHORES"
+    stap_test "stap-probe-sem-noopt" additional_flags=-DUSE_SEMAPHORES
 }
 
 with_test_prefix "without semaphore, optimized" {
 }
 
 with_test_prefix "with semaphore, optimized" {
-    stap_test_no_debuginfo "stap-probe-sem-opt" "-DUSE_SEMAPHORES"
+    stap_test_no_debuginfo "stap-probe-sem-opt" additional_flags=-DUSE_SEMAPHORES
 }