This patch adds tests for function and function pointer for i386.
* ld-i386/plt-lib.c: New file.
* ld-i386/plt-main.out: Likewise.
* ld-i386/plt-main1.c: Likewise.
* ld-i386/plt-main1.rd: Likewise.
* ld-i386/plt-main2.c: Likewise.
* ld-i386/plt-main2.rd: Likewise.
* ld-i386/plt-main3.c: Likewise.
* ld-i386/plt-main3.rd: Likewise.
* ld-i386/plt-main4.c: Likewise.
* ld-i386/plt-main4.rd: Likewise.
* ld-i386/plt-main5.c: Likewise.
* ld-i386/i386.exp: Run plt-main tests.
+2014-11-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ * ld-i386/plt-lib.c: New file.
+ * ld-i386/plt-main.out: Likewise.
+ * ld-i386/plt-main1.c: Likewise.
+ * ld-i386/plt-main1.rd: Likewise.
+ * ld-i386/plt-main2.c: Likewise.
+ * ld-i386/plt-main2.rd: Likewise.
+ * ld-i386/plt-main3.c: Likewise.
+ * ld-i386/plt-main3.rd: Likewise.
+ * ld-i386/plt-main4.c: Likewise.
+ * ld-i386/plt-main4.rd: Likewise.
+ * ld-i386/plt-main5.c: Likewise.
+
+ * ld-i386/i386.exp: Run plt-main tests.
+
2014-11-21 H.J. Lu <hongjiu.lu@intel.com>
* ld-x86-64/x86-64.exp: Run plt-main test with -pie.
run_dump_test "pr13302"
run_dump_test "pr14215"
run_dump_test "pr17057"
+
+# Must be Linux native with the C compiler
+if { [isnative]
+ && [istarget "i?86-*-linux*"]
+ && [which $CC] != 0 } {
+ run_cc_link_tests [list \
+ [list \
+ "Build plt-lib.so" \
+ "-shared" \
+ "-fPIC" \
+ { plt-lib.c } \
+ {} \
+ "libplt-lib.so" \
+ ] \
+ [list \
+ "Build libplt-main1.a" \
+ "" \
+ "-fPIC" \
+ { plt-main1.c } \
+ {{readelf {-Wr} plt-main1.rd}} \
+ "libplt-main1.a" \
+ ] \
+ [list \
+ "Build libplt-main2.a" \
+ "" \
+ "-fPIC" \
+ { plt-main2.c } \
+ {{readelf {-Wr} plt-main2.rd}} \
+ "libplt-main2.a" \
+ ] \
+ [list \
+ "Build libplt-main3.a" \
+ "" \
+ "-fPIC" \
+ { plt-main3.c } \
+ {{readelf {-Wr} plt-main3.rd}} \
+ "libplt-main3.a" \
+ ] \
+ [list \
+ "Build libplt-main4.a" \
+ "" \
+ "-fPIC" \
+ { plt-main4.c } \
+ {{readelf {-Wr} plt-main4.rd}} \
+ "libplt-main4.a" \
+ ] \
+ ]
+
+ run_ld_link_exec_tests [] [list \
+ [list \
+ "Run plt-main" \
+ "tmpdir/plt-main1.o tmpdir/plt-main2.o tmpdir/plt-main3.o \
+ tmpdir/plt-main4.o tmpdir/libplt-lib.so" \
+ "" \
+ { plt-main5.c } \
+ "plt-main" \
+ "plt-main.out" \
+ ] \
+ [list \
+ "Run plt-main with PIE" \
+ "tmpdir/plt-main1.o tmpdir/plt-main2.o tmpdir/plt-main3.o \
+ tmpdir/plt-main4.o tmpdir/libplt-lib.so -pie" \
+ "" \
+ { plt-main5.c } \
+ "plt-main-pie" \
+ "plt-main.out" \
+ "-fPIC" \
+ ] \
+ ]
+}
--- /dev/null
+int
+foo (void)
+{
+ return 1;
+}
+
+int
+bar (void)
+{
+ return -1;
+}
--- /dev/null
+extern int bar(void);
+typedef int (*func_p) (void);
+
+func_p
+get_bar (void)
+{
+ return bar;
+}
--- /dev/null
+#...
+[0-9a-f ]+R_386_GOT32 +0+ +bar
+#pass
--- /dev/null
+extern int foo(void);
+typedef int (*func_p) (void);
+func_p foo_ptr = foo;
--- /dev/null
+#...
+[0-9a-f ]+R_386_32 +0+ +foo
+#pass
--- /dev/null
+extern int bar(void);
+typedef int (*func_p) (void);
+extern func_p get_bar (void);
+
+void
+check_bar (void)
+{
+ func_p bar_ptr = get_bar ();
+ if (bar_ptr != bar)
+ __builtin_abort ();
+ if (bar_ptr() != -1)
+ __builtin_abort ();
+ if (bar() != -1)
+ __builtin_abort ();
+}
--- /dev/null
+#...
+[0-9a-f ]+R_386_GOT32 +0+ +bar
+#...
+[0-9a-f ]+R_386_PLT32 +0+ +bar
+#pass
--- /dev/null
+extern int foo(void);
+typedef int (*func_p) (void);
+extern func_p foo_ptr;
+
+void
+check_foo (void)
+{
+ if (foo_ptr != foo)
+ __builtin_abort ();
+ if (foo_ptr() != 1)
+ __builtin_abort ();
+ if (foo() != 1)
+ __builtin_abort ();
+}
--- /dev/null
+#...
+[0-9a-f ]+R_386_GOT32 +0+ +foo
+#...
+[0-9a-f ]+R_386_PLT32 +0+ +foo
+#pass
--- /dev/null
+#include <stdio.h>
+
+extern void check_foo (void);
+extern void check_bar (void);
+
+int
+main (void)
+{
+ check_foo ();
+ check_bar ();
+
+ printf ("OK\n");
+
+ return 0;
+}