From 975c74c1f51679cfe62d1fd455344f12399fb51c Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Tue, 27 Sep 2016 17:04:39 +0200 Subject: x86-64: Prefer 32S relocations This target has _32 and _32S relocs (the latter being for signed 32 bit entities). All instruction displacements have to use the 32S variants. Normal references like .long s normally would use the _32 variant. For normal executables this doesn't matter. For shared libraries neither (which use PC-relative relocs). But it matters for things like the kernel that are linked to high addresses (signed ones). There the GNU linker would error out on overflow for the _32 variant. To keep life simple we simply switch from _32 to _32S altogether. Strictly speaking it's still wrong, but in practice using _32 is more often wrong than using _32S ;) --- x86_64-link.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'x86_64-link.c') diff --git a/x86_64-link.c b/x86_64-link.c index 9ff234b..602a8ef 100644 --- a/x86_64-link.c +++ b/x86_64-link.c @@ -3,7 +3,7 @@ #define EM_TCC_TARGET EM_X86_64 /* relocation type for 32 bit data relocation */ -#define R_DATA_32 R_X86_64_32 +#define R_DATA_32 R_X86_64_32S #define R_DATA_PTR R_X86_64_64 #define R_JMP_SLOT R_X86_64_JUMP_SLOT #define R_GLOB_DAT R_X86_64_GLOB_DAT -- cgit v1.3.1