From 41053876509c8e940eb1447717bf2655484bf6af Mon Sep 17 00:00:00 2001 From: Zach van Rijn Date: Tue, 18 Jan 2022 18:04:04 +0000 Subject: system/fakeroot: add two patches for ppc64. fixes #438. --- system/fakeroot/fix-prototype-generation.patch | 59 ++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 system/fakeroot/fix-prototype-generation.patch (limited to 'system/fakeroot/fix-prototype-generation.patch') diff --git a/system/fakeroot/fix-prototype-generation.patch b/system/fakeroot/fix-prototype-generation.patch new file mode 100644 index 000000000..38d32ff3b --- /dev/null +++ b/system/fakeroot/fix-prototype-generation.patch @@ -0,0 +1,59 @@ +Subject: Fix prototype generation for openat +Author: Christoph Biedl +Date: 2021-12-30 +Bug-Debian: https://bugs.debian.org/995393 +Forwarded: Yes (implicitely) + + As jrtc27 pointed out in IRC, ppc64el is more strict than other + architectures when it comes to va_arg handling: + + it's that ppc64le uses the elfv2 abi, and for variadic calls you + must reserve space for a parameter save area + + So enhance wrapawk to create a proper prototype and argument + handling although it's specific to the openat call. Also add the + missing documentation for the sixth column to wrapfunc.inp. + +--- a/wrapawk ++++ b/wrapawk +@@ -37,7 +37,25 @@ + argtype=$3; + argname=$4; + MACRO=$5; +- if(MACRO){ ++ openat_extra=$6; ++ if(openat_extra){ ++ print " {(void(*))&next_" name ", \"" name "\"}," > structfile; ++ print "extern " ret " (*next_" name ")" openat_extra ";" > headerfile; ++ print ret " (*next_" name ")" openat_extra "=tmp_" name ";"> deffile; ++ ++ print ret " tmp_" name, openat_extra "{" > tmpffile; ++ print " mode_t mode = 0;" > tmpffile; ++ print " if (flags & O_CREAT) {" > tmpffile; ++ print " va_list args;" > tmpffile; ++ print " va_start(args, flags);" > tmpffile; ++ print " mode = va_arg(args, int);" > tmpffile; ++ print " va_end(args);" > tmpffile; ++ print " }" > tmpffile; ++ print " load_library_symbols();" > tmpffile; ++ print " return next_" name, argname ";" > tmpffile; ++ print "}" > tmpffile; ++ print "" > tmpffile; ++ } else if(MACRO){ + print " {(void(*))&NEXT_" MACRO "_NOARG, " name "_QUOTE}," > structfile; + print "extern " ret " (*NEXT_" MACRO "_NOARG)" argtype ";" > headerfile; + print ret " (*NEXT_" MACRO "_NOARG)" argtype "=TMP_" MACRO ";"> deffile; +--- a/wrapfunc.inp ++++ b/wrapfunc.inp +@@ -9,8 +9,10 @@ + /**/ */ + /* each line of this file lists 4 fields, seperated by a ";". */ + /* The first field is the name of the wrapped function, then it's return */ +-/* value. After that come the function arguments with types, and the last */ ++/* value. After that come the function arguments with types, and the fifth */ + /* field contains the function arguments without types. */ ++/* A sixth field is a special needed when wrapping the openat syscall. */ ++/* Otherwise it's like the third (function arguments with types). */ + /**/ + + /* __*xstat are used on glibc systems instead of just *xstat. */ -- cgit v1.2.3-70-g09d2