[asterisk-bugs] [JIRA] (ASTERISK-28685) check_expr2: linking (when hardening) and cross-compiling troubles
Asterisk Team (JIRA)
noreply at issues.asterisk.org
Thu Mar 5 11:43:26 CST 2020
[ https://issues.asterisk.org/jira/browse/ASTERISK-28685?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Asterisk Team updated ASTERISK-28685:
-------------------------------------
Target Release Version/s: 16.9.0
> check_expr2: linking (when hardening) and cross-compiling troubles
> ------------------------------------------------------------------
>
> Key: ASTERISK-28685
> URL: https://issues.asterisk.org/jira/browse/ASTERISK-28685
> Project: Asterisk
> Issue Type: Bug
> Security Level: None
> Components: Utilities/General
> Affects Versions: 16.6.1
> Environment: OpenWrt gcc-8.3.0, binutils 2.31.1
> Reporter: Sebastian Kemper
> Assignee: Sebastian Kemper
> Severity: Minor
> Target Release: 13.32.0, 16.9.0
>
>
> Hi all,
> Honestly I'm not too sure what check_expr2 is used for, but we bundle it as an optional package on OpenWrt.
> In the past we already had to comment out the test run "./check_expr2 expr2.testinput" because we're cross-compiling. And now OpenWrt introduced another hardening option into our buildroot: ASLR PIE. It's not enabled by default (yet), but if you select it the asterisk package fails to build:
> {noformat}
> ccache_cc -g -c -I/home/sk/tmp/openwrt/build_dir/target-mips_24kc_musl/asterisk-16.6.1/include -DSTANDALONE /home/sk/tmp/openwrt/build_dir/target-mips_24kc_musl/asterisk-16.6.1/main/ast_expr2f.c -o ast_expr2fz.o
> cc1: note: someone does not honour COPTS correctly, passed 0 times
> ccache_cc -g -c -I/home/sk/tmp/openwrt/build_dir/target-mips_24kc_musl/asterisk-16.6.1/include -DSTANDALONE2 /home/sk/tmp/openwrt/build_dir/target-mips_24kc_musl/asterisk-16.6.1/main/ast_expr2.c -o ast_expr2z.o
> cc1: note: someone does not honour COPTS correctly, passed 0 times
> ccache_cc -g -o check_expr2 ast_expr2fz.o ast_expr2z.o astmm.o -lm -L/home/sk/tmp/openwrt/staging_dir/target-mips_24kc_musl/usr/lib -L/home/sk/tmp/openwrt/staging_dir/target-mips_24kc_musl/lib -L/home/sk/tmp/openwrt/staging_dir/toolchain-mips_24kc_gcc-8.3.0_musl/usr/lib -L/home/sk/tmp/openwrt/staging_dir/toolchain-mips_24kc_gcc-8.3.0_musl/lib -fpic -specs=/home/sk/tmp/openwrt/include/hardened-ld-pie.specs -znow -zrelro -L/home/sk/tmp/openwrt/staging_dir/target-mips_24kc_musl/usr/lib/libiconv-stub/lib -Wl,-rpath-link=/home/sk/tmp/openwrt/staging_dir/target-mips_24kc_musl/usr/lib/libiconv-stub/lib -L/home/sk/tmp/openwrt/staging_dir/target-mips_24kc_musl/usr/lib/libintl-stub/lib -Wl,-rpath-link=/home/sk/tmp/openwrt/staging_dir/target-mips_24kc_musl/usr/lib/libintl-stub/lib
> /home/sk/tmp/openwrt/staging_dir/toolchain-mips_24kc_gcc-8.3.0_musl/lib/gcc/mips-openwrt-linux-musl/8.3.0/../../../../mips-openwrt-linux-musl/bin/ld: ast_expr2fz.o: relocation R_MIPS_HI16 against `stdin' can not be used when making a shared object; recompile with -fPIC
> /home/sk/tmp/openwrt/staging_dir/toolchain-mips_24kc_gcc-8.3.0_musl/lib/gcc/mips-openwrt-linux-musl/8.3.0/../../../../mips-openwrt-linux-musl/bin/ld: ast_expr2z.o: relocation R_MIPS_26 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
> /home/sk/tmp/openwrt/staging_dir/toolchain-mips_24kc_gcc-8.3.0_musl/lib/gcc/mips-openwrt-linux-musl/8.3.0/../../../../mips-openwrt-linux-musl/bin/ld: non-dynamic relocations refer to dynamic symbol stdin
> /home/sk/tmp/openwrt/staging_dir/toolchain-mips_24kc_gcc-8.3.0_musl/lib/gcc/mips-openwrt-linux-musl/8.3.0/../../../../mips-openwrt-linux-musl/bin/ld: failed to set dynamic section sizes: bad value
> collect2: error: ld returned 1 exit status
> {noformat}
> So the first thing that happens is that the compiler warns us that there are no compiler flags provided. And this is followed by linker failure.
> I'm not sure why Asterisk chooses to compile the objects that make up check_expr2 without compiler flags. Maybe it's just an oversight. When I add them all this goes away.
> I also ran check_expr2 (so, the one compiled with the compiler flags) against the test file on a target device. The output looks reasonable to me:
> {noformat}
> root at hank2:/tmp# ./check_expr2 expr2.testinput
> Expression: 2 + 2 Result: [1] '4'
> Expression: 2 + 2 Result: [1] '4'
> Expression: Result: [0] ''
> Expression: 2 - 4 Result: [2] '-2'
> Expression: 4 - 2 Result: [1] '2'
> Expression: -4 - -2 Result: [2] '-2'
> Expression: 4 + 2 * 8 Result: [2] '20'
> Expression: (4 + 2) * 8 Result: [2] '48'
> Expression: 4 + (2 * 8) Result: [2] '20'
> Expression: 4 + (2 * 8) ? 3 :: 6 Result: [1] '3'
> Expression: 4 + 8 / 2 Result: [1] '8'
> Expression: 4 + 8 / 3 Result: [19] '6.66666666666666607'
> Expression: (4+8) / 3 Result: [1] '4'
> Expression: 4 + 8 % 3 Result: [1] '6'
> Expression: 4 + 9 % 3 Result: [1] '4'
> Expression: (4+9) %3 Result: [1] '1'
> Expression: (4+8) %3 Result: [1] '0'
> Expression: (4+9) %3 Result: [1] '1'
> Expression: (4+8) %3 Result: [1] '0'
> Expression: (4+9) % 3 Result: [1] '1'
> Expression: (4+8) % 3 Result: [1] '0'
> Expression: (4+9) % 3 Result: [1] '1'
> Expression: (4+8) % 3 Result: [1] '0'
> Expression: (4+9)% 3 Result: [1] '1'
> Expression: (4+8)% 3 Result: [1] '0'
> Expression: (4+9)% 3 Result: [1] '1'
> Expression: (4+8)% 3 Result: [1] '0'
> Expression: 4 & 4 Result: [1] '4'
> Expression: 0 & 4 Result: [1] '0'
> Expression: 0 & 0 Result: [1] '0'
> Expression: 2 | 0 Result: [1] '2'
> Expression: 2 | 4 Result: [1] '2'
> Expression: 0 | 0 Result: [1] '0'
> Expression: !0 | 0 Result: [1] '1'
> Expression: !4 | 0 Result: [1] '0'
> Expression: 4 | !0 Result: [1] '4'
> Expression: !4 | !0 Result: [1] '1'
> Expression: 3 < 4 Result: [1] '1'
> Expression: 4 < 3 Result: [1] '0'
> Expression: 3 > 4 Result: [1] '0'
> Expression: 4 > 3 Result: [1] '1'
> Expression: 3 = 3 Result: [1] '1'
> Expression: 3 = 4 Result: [1] '0'
> Expression: 3 != 3 Result: [1] '0'
> Expression: 3 != 4 Result: [1] '1'
> Expression: 3 >= 4 Result: [1] '0'
> Expression: 3 >= 3 Result: [1] '1'
> Expression: 4 >= 3 Result: [1] '1'
> Expression: 3 <= 4 Result: [1] '1'
> Expression: 4 <= 3 Result: [1] '0'
> Expression: 4 <= 4 Result: [1] '1'
> Expression: 3 > 4 & 4 < 3 Result: [1] '0'
> Expression: 4 > 3 & 3 < 4 Result: [1] '1'
> Expression: x = x Result: [1] '1'
> Expression: y = x Result: [1] '0'
> Expression: x != y Result: [1] '1'
> Expression: x != x Result: [1] '0'
> Expression: "Something interesting" =~ interesting Result: [2] '11'
> Expression: "Something interesting" =~ Something Result: [1] '9'
> Expression: "Something interesting" : Something Result: [1] '9'
> Expression: "Something interesting" : interesting Result: [1] '0'
> Expression: "Something interesting" =~ "interesting" Result: [2] '11'
> Expression: "Something interesting" =~ "Something" Result: [1] '9'
> Expression: "Something interesting" : "Something" Result: [1] '9'
> Expression: "Something interesting" : "interesting" Result: [1] '0'
> Expression: "Something interesting" =~ (interesting) Result: [2] '11'
> Expression: "Something interesting" =~ (Something) Result: [1] '9'
> Expression: "Something interesting" : (Something) Result: [1] '9'
> Expression: "Something interesting" : (interesting) Result: [1] '0'
> Expression: "Something interesting" =~ "\(interesting\)" Result: [1] '0'
> Expression: "Something interesting" =~ "\(Something\)" Result: [1] '0'
> Expression: "Something interesting" : "\(Something\)" Result: [1] '0'
> Expression: "Something interesting" : "\(interesting\)" Result: [1] '0'
> Expression: "011043567857575" : "011\(..\)" Result: [1] '0'
> Expression: "9011043567857575" : "011\(..\)" Result: [1] '0'
> Expression: "011043567857575" =~ "011\(..\)" Result: [1] '0'
> Expression: "9011043567857575" =~ "011\(..\)" Result: [1] '0'
> Expression: "Something interesting" =~ (interesting) Result: [2] '11'
> Expression: "Something interesting" =~ (Something) Result: [1] '9'
> Expression: "Something interesting" : (Something) Result: [1] '9'
> Expression: "Something interesting" : (interesting) Result: [1] '0'
> Expression: "Something interesting" =~ "(interesting)" Result: [11] 'interesting'
> Expression: "Something interesting" =~ "(Something)" Result: [9] 'Something'
> Expression: "Something interesting" : "(Something)" Result: [9] 'Something'
> Expression: "Something interesting" : "(interesting)" Result: [0] ''
> Expression: "011043567857575" : "011(..)" Result: [2] '04'
> Expression: "9011043567857575" : "011(..)" Result: [0] ''
> Expression: "011043567857575" =~ "011(..)" Result: [2] '04'
> Expression: "9011043567857575" =~ "011(..)" Result: [2] '04'
> Expression: 3 Result: [1] '3'
> Expression: something Result: [9] 'something'
> Expression: 043 Result: [3] '043'
> Expression: 2.1+4.2 Result: [19] '6.30000000000000071'
> Expression: 1.500003+1.4999999999999898989898989898989898989889898 Result: [19] '3.00000299999998976'
> Expression: 1/4 Result: [4] '0.25'
> Expression: 2.3 + COS(3.141592653) Result: [19] '1.29999999999999982'
> Expression: REMAINDER(13,3) Result: [1] '1'
> Expression: 2.3 + SIN(3.1415823) Result: [19] '2.30001035358979289'
> Expression: TAN(45) + 2.3 Result: [19] '3.91977519054386114'
> Expression: POW(10.0,4.0) Result: [5] '10000'
> LOG: lev:4 file:ast_expr2.y line:1071 func: op_func Error! 'SQRT' is not available in the standalone version!
> Expression: SQRT(4) Result: [1] '0'
> LOG: lev:4 file:ast_expr2.y line:1071 func: op_func Error! 'SQRT' is not available in the standalone version!
> Expression: SQRT(2) Result: [1] '0'
> Expression: FLOOR(2.4) Result: [1] '2'
> Expression: FLOOR(2.6) Result: [1] '2'
> Expression: CEIL(2.4) Result: [1] '3'
> Expression: CEIL(2.6) Result: [1] '3'
> Expression: ROUND(2.4) Result: [1] '2'
> Expression: ROUND(2.5) Result: [1] '3'
> Expression: ROUND(2.6) Result: [1] '3'
> Expression: RINT(2.4) Result: [1] '2'
> Expression: RINT(2.5) Result: [1] '2'
> Expression: RINT(2.6) Result: [1] '3'
> Expression: TRUNC(2.4) Result: [1] '2'
> Expression: TRUNC(2.5) Result: [1] '2'
> Expression: TRUNC(2.6) Result: [1] '2'
> Expression: EXP(1.0) Result: [19] '2.71828182845904509'
> Expression: EXP2(1.0) Result: [1] '2'
> Expression: LOG(10) Result: [18] '2.3025850929940459'
> Expression: LOG2(10) Result: [19] '3.32192809488736218'
> Expression: LOG10(10) Result: [1] '1'
> Expression: ATAN2(4,5) Result: [20] '0.674740942223552742'
> Expression: ACOS(12) Result: [3] 'nan'
> Expression: ASIN(1) Result: [19] '1.57079632679489656'
> Expression: ATAN(10) Result: [18] '1.4711276743037347'
> LOG: lev:4 file:ast_expr2.y line:1071 func: op_func Error! 'SQRT' is not available in the standalone version!
> LOG: lev:4 file:ast_expr2.y line:1071 func: op_func Error! 'SQRT' is not available in the standalone version!
> Expression: SQRT(2)*SQRT(2) Result: [1] '0'
> LOG: lev:3 file:ast_expr2.y line:1468 func: op_times overflow
> LOG: lev:3 file:ast_expr2.y line:1468 func: op_times overflow
> Expression: ATAN(12) + TRUNC(2.4) *ASIN(14.3) *ACOS(1.2) Result: [3] 'nan'
> Expression: ATAN(.912) Result: [19] '1.57079632679489656'
> Expression: TRUNC(2.4) Result: [1] '2'
> Expression: ASIN(0.705) Result: [19] '0.78242314584342898'
> Expression: ACOS(.12) Result: [3] 'nan'
> Expression: ATAN(.912) + TRUNC(2.4) - ASIN(0.705) + ACOS(.12) Result: [3] 'nan'
> LOG: lev:4 file:ast_expr2.y line:1071 func: op_func Error! 'MATH' is not available in the standalone version!
> Expression: MATH(3*9) Result: [1] '0'
> Expression: ${GLOBAL(ULKOPREFIX)}9${x} Result: [26] '${GLOBAL(ULKOPREFIX)}9${x}'
> Expression: 512059${x} Result: [10] '512059${x}'
> root at hank2:/tmp#
> {noformat}
> I'll raise a Gerrit case against this and add a patch which adds the compiler flags and prevents the test run when cross-compiling.
--
This message was sent by Atlassian JIRA
(v6.2#6252)
More information about the asterisk-bugs
mailing list