I stepped through 2 builds side-by-side in gdb - one good build built
with gcc 7.1, and one bad build, built with gcc 7.2. I managed to narrow
it down to a bug in sha256_block_data_order.

One of the first differences I spotted was that the good build branches
almost immediately to a NEON code path (sha256_block_data_order_neon),
whereas the broken build continues on the non-NEON code path.

If we look at the first few instructions of sha256_block_data_order in a
good build:

   0xf7699c60 <+0>:     sub     r3, pc, #8
   0xf7699c64 <+4>:     ldr     r12, [pc, #-40] ; 0xf7699c44
   0xf7699c68 <+8>:     ldr     r12, [r3, r12]

The first instruction basically loads the address of the start of the
function in to %r3, which we can see if we step past it:

(gdb) info registers 
r0             0x413558 4273496
r1             0x413580 4273536
r2             0x1      1
r3             0xf7699c60       4150893664
r4             0x413558 4273496
r5             0xfffef35c       4294898524
r6             0x0      0
r7             0x413580 4273536
r8             0x0      0
r9             0xf77efab8       4152294072
r10            0xf77b9dec       4152073708
r11            0x0      0
r12            0x0      0
sp             0xfffef2c8       0xfffef2c8
lr             0xf7697e5c       -144081316
pc             0xf7699c64       0xf7699c64 <sha256_block_data_order+4>
cpsr           0x80080010       -2146959344
(gdb) p sha256_block_data_order
$1 = {<text variable, no debug info>} 0xf7699c60 <sha256_block_data_order>

The second instruction loads a value from an address 40 bytes before the 
instruction in to %r12. Looking in sha256-armv4.S, this value is 
"OPENSSL_armcap_P - sha256_block_data_order", or the offset of OPENSSL_armcap_P 
from the start of sha256_block_data_order.
The third instruction loads the value of OPENSSL_armcap_P in to %r12.

Stepping through these instructions gives this state:

(gdb) info registers 
r0             0x413558 4273496
r1             0x413580 4273536
r2             0x1      1
r3             0xf7699c60       4150893664
r4             0x413558 4273496
r5             0xfffef35c       4294898524
r6             0x0      0
r7             0x413580 4273536
r8             0x0      0
r9             0xf77efab8       4152294072
r10            0xf77b9dec       4152073708
r11            0x0      0
r12            0x3      3
sp             0xfffef2c8       0xfffef2c8
lr             0xf7697e5c       -144081316
pc             0xf7699c6c       0xf7699c6c <sha256_block_data_order+12>
cpsr           0x80080010       -2146959344

So the value of OPENSSL_armcap_P is 3, which causes the following
instructions to take the NEON path:

   0xf7699c6c <+12>:    tst     r12, #16
   0xf7699c70 <+16>:    bne     0xf769b660 <sha256_block_data_order_armv8>
   0xf7699c74 <+20>:    tst     r12, #1
   0xf7699c78 <+24>:    bne     0xf769aa60 <sha256_block_data_order_neon>

-- 
You received this bug notification because you are a member of Ubuntu
Touch seeded packages, which is subscribed to openssl in Ubuntu.
https://bugs.launchpad.net/bugs/1729850

Title:
  artful openssl FTBFS on armhf

Status in binutils package in Ubuntu:
  New
Status in gcc-7 package in Ubuntu:
  New
Status in openssl package in Ubuntu:
  New

Bug description:
  openssl FTBFS on artful armhf with the following:

  ../util/shlib_wrap.sh ./sha256t
  Testing SHA-256 
  TEST 1 of 3 failed.

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/binutils/+bug/1729850/+subscriptions

-- 
Mailing list: https://launchpad.net/~touch-packages
Post to     : touch-packages@lists.launchpad.net
Unsubscribe : https://launchpad.net/~touch-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to