+2021-06-17 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/27973
+ * testsuite/ld-x86-64/x86-64.exp: Run protected function tests.
+ * testsuite/ld-x86-64/protected-func-1.h: New file.
+ * testsuite/ld-x86-64/protected-func-1a.s: Likewise.
+ * testsuite/ld-x86-64/protected-func-1b.c: Likewise.
+
2021-06-17 Fangrui Song <maskray@google.com>
* ldlex.h (enum option_values): Add OPTION_NO_PIE.
--- /dev/null
+extern int protected_func_1a (void);
+extern int protected_func_1b (void);
+
+typedef int (*protected_func_type) (void);
+extern protected_func_type protected_func_1a_p (void);
+extern protected_func_type protected_func_1b_p (void);
--- /dev/null
+ .text
+ .p2align 4
+ .protected protected_func_1a
+ .globl protected_func_1a
+ .type protected_func_1a, @function
+protected_func_1a:
+.LFB0:
+ .cfi_startproc
+ movl $1, %eax
+ ret
+ .cfi_endproc
+.LFE0:
+ .size protected_func_1a, .-protected_func_1a
+ .p2align 4
+ .protected protected_func_1b
+ .globl protected_func_1b
+ .type protected_func_1b, @function
+protected_func_1b:
+.LFB1:
+ .cfi_startproc
+ movl $2, %eax
+ ret
+ .cfi_endproc
+.LFE1:
+ .size protected_func_1b, .-protected_func_1b
+ .p2align 4
+ .globl protected_func_1a_p
+ .type protected_func_1a_p, @function
+protected_func_1a_p:
+.LFB2:
+ .cfi_startproc
+ movq protected_func_1a@GOTPCREL(%rip), %rax
+ ret
+ .cfi_endproc
+.LFE2:
+ .size protected_func_1a_p, .-protected_func_1a_p
+ .p2align 4
+ .globl protected_func_1b_p
+ .type protected_func_1b_p, @function
+protected_func_1b_p:
+.LFB3:
+ .cfi_startproc
+ movq protected_func_1b@GOTPCREL(%rip), %rax
+ ret
+ .cfi_endproc
+.LFE3:
+ .size protected_func_1b_p, .-protected_func_1b_p
+ .section .note.GNU-stack,"",@progbits
--- /dev/null
+#include <stdio.h>
+
+#include "protected-func-1.h"
+
+int
+protected_func_1b (void)
+{
+ return 3;
+}
+
+int
+main (void)
+{
+ int res = 0;
+
+ /* Check if we get the same address for the protected function symbol. */
+ if (protected_func_1a != protected_func_1a_p ())
+ {
+ puts ("'protected_func_1a' in main and shared library doesn't have same address");
+ res = 1;
+ }
+
+ /* Check if we get the different addresses for the protected function
+ symbol. */
+ if (protected_func_1b == protected_func_1b_p ())
+ {
+ puts ("'protected_func_1b' in main and shared library has same address");
+ res = 1;
+ }
+
+ if (!res)
+ puts ("PASS");
+
+ return res;
+}
{readelf -rW pr22842b.rd}} \
"pr22842" \
] \
+ [list \
+ "Build libprotected-func-1.so" \
+ "-shared" \
+ "-fPIC -Wa,-mx86-used-note=yes" \
+ { protected-func-1a.s } \
+ {} \
+ "libprotected-func-1.so" \
+ ] \
]
if {[istarget "x86_64-*-linux*-gnux32"]} {
"pr23997" \
"pass.out" \
] \
+ [list \
+ "Run protected-func-1 without PIE" \
+ "-Wl,--no-as-needed tmpdir/libprotected-func-1.so" \
+ "-Wa,-mx86-used-note=yes" \
+ { protected-func-1b.c } \
+ "protected-func-1a" \
+ "pass.out" \
+ ] \
+ [list \
+ "Run protected-func-1 with PIE" \
+ "-Wl,--no-as-needed -pie tmpdir/libprotected-func-1.so" \
+ "-Wa,-mx86-used-note=yes" \
+ { protected-func-1b.c } \
+ "protected-func-1b" \
+ "pass.out" \
+ "-fPIE" \
+ ] \
]
# Run-time tests which require working ifunc attribute support.