[Home]

Summary:ASTERISK-28685: check_expr2: linking (when hardening) and cross-compiling troubles
Reporter:Sebastian Kemper (skemper)Labels:
Date Opened:2020-01-12 05:16:53.000-0600Date Closed:2020-03-04 06:11:50.000-0600
Priority:MinorRegression?No
Status:Closed/CompleteComponents:Utilities/General
Versions:16.6.1 Frequency of
Occurrence
Constant
Related
Issues:
Environment:OpenWrt gcc-8.3.0, binutils 2.31.1Attachments:
Description: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@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@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.
Comments:By: Asterisk Team (asteriskteam) 2020-01-12 05:16:55.315-0600

Thanks for creating a report! The issue has entered the triage process. That means the issue will wait in this status until a Bug Marshal has an opportunity to review the issue. Once the issue has been reviewed you will receive comments regarding the next steps towards resolution.

A good first step is for you to review the [Asterisk Issue Guidelines|https://wiki.asterisk.org/wiki/display/AST/Asterisk+Issue+Guidelines] if you haven't already. The guidelines detail what is expected from an Asterisk issue report.

Then, if you are submitting a patch, please review the [Patch Contribution Process|https://wiki.asterisk.org/wiki/display/AST/Patch+Contribution+Process].

Please note that once your issue enters an open state it has been accepted. As Asterisk is an open source project there is no guarantee or timeframe on when your issue will be looked into. If you need expedient resolution you will need to find and pay a suitable developer. Asking for an update on your issue will not yield any progress on it and will not result in a response. All updates are posted to the issue when they occur.

By: Friendly Automation (friendly-automation) 2020-03-04 06:11:52.253-0600

Change 13591 merged by Joshua Colp:
check_expr2: fix cross-compile/hardening issues

[https://gerrit.asterisk.org/c/asterisk/+/13591|https://gerrit.asterisk.org/c/asterisk/+/13591]

By: Friendly Automation (friendly-automation) 2020-03-04 06:28:36.487-0600

Change 13873 merged by Joshua Colp:
check_expr2: fix cross-compile/hardening issues

[https://gerrit.asterisk.org/c/asterisk/+/13873|https://gerrit.asterisk.org/c/asterisk/+/13873]

By: Friendly Automation (friendly-automation) 2020-03-04 06:58:19.267-0600

Change 13875 merged by Joshua Colp:
check_expr2: fix cross-compile/hardening issues

[https://gerrit.asterisk.org/c/asterisk/+/13875|https://gerrit.asterisk.org/c/asterisk/+/13875]

By: Friendly Automation (friendly-automation) 2020-03-04 06:58:30.449-0600

Change 13874 merged by Joshua Colp:
check_expr2: fix cross-compile/hardening issues

[https://gerrit.asterisk.org/c/asterisk/+/13874|https://gerrit.asterisk.org/c/asterisk/+/13874]