Add function and function pointer tests for i386

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.
This commit is contained in:
H.J. Lu 2014-11-21 08:45:02 -08:00
parent ce641d0b6b
commit 4a7a792388
13 changed files with 169 additions and 0 deletions

View File

@ -1,3 +1,19 @@
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.

View File

@ -263,3 +263,73 @@ run_dump_test "pr12627"
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" \
] \
]
}

View File

@ -0,0 +1,11 @@
int
foo (void)
{
return 1;
}
int
bar (void)
{
return -1;
}

View File

@ -0,0 +1 @@
OK

View File

@ -0,0 +1,8 @@
extern int bar(void);
typedef int (*func_p) (void);
func_p
get_bar (void)
{
return bar;
}

View File

@ -0,0 +1,3 @@
#...
[0-9a-f ]+R_386_GOT32 +0+ +bar
#pass

View File

@ -0,0 +1,3 @@
extern int foo(void);
typedef int (*func_p) (void);
func_p foo_ptr = foo;

View File

@ -0,0 +1,3 @@
#...
[0-9a-f ]+R_386_32 +0+ +foo
#pass

View File

@ -0,0 +1,15 @@
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 ();
}

View File

@ -0,0 +1,5 @@
#...
[0-9a-f ]+R_386_GOT32 +0+ +bar
#...
[0-9a-f ]+R_386_PLT32 +0+ +bar
#pass

View File

@ -0,0 +1,14 @@
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 ();
}

View File

@ -0,0 +1,5 @@
#...
[0-9a-f ]+R_386_GOT32 +0+ +foo
#...
[0-9a-f ]+R_386_PLT32 +0+ +foo
#pass

View File

@ -0,0 +1,15 @@
#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;
}