Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ldconfig warns about truncated libraries #44

Closed
darealshinji opened this issue Nov 9, 2014 · 26 comments
Closed

ldconfig warns about truncated libraries #44

darealshinji opened this issue Nov 9, 2014 · 26 comments

Comments

@darealshinji
Copy link
Contributor

ldconfig puts a warning on files that were modified with patchelf:

djcj patchelf-master $ sudo src/patchelf --set-rpath /usr/lib /usr/lib/x86_64-linux-gnu/libx264.so.142
djcj patchelf-master $ LANG=C sudo ldconfig
/sbin/ldconfig.real: file /usr/lib/x86_64-linux-gnu/libx264.so.142 is truncated

djcj patchelf-master $ 
@darealshinji
Copy link
Contributor Author

The sections .dynsym and .dynstr are moved to the end of the file. Originally .shstrtab was the last section. That might cause the trouble.

@AaronDMarasco-VSI
Copy link
Contributor

I am getting the same error when using the --set-soname option on 63296c4.

@sjackman
Copy link

sjackman commented May 8, 2017

I'm seeing this error as well. Do you have a fix or workaround?

@AaronDMarasco-VSI
Copy link
Contributor

For me with --set-soname, I am pretty sure replaceSection() is broken. Since I am always shortening the name, I have a custom patch that detects I am calling it and does the name replacement directly in memory by zeroing out the unused bytes at the end. The original code always assumed the new name was longer and called replaceSection().

@sjackman
Copy link

sjackman commented May 8, 2017

I use --set-interpreter and --set-rpath and they usually get longer for me. Thanks for the tip though. I could maybe arrange it for them to get shorter rather than longer. Probably not always though.

@darealshinji
Copy link
Contributor Author

@AaronDMarasco-VSI Can you provide said custom patch?

@AaronDMarasco-VSI
Copy link
Contributor

@darealshinji It doesn't fix replaceSection(); instead it bypasses it in a very specific way that would be pretty useless for most people. I compile the .so with the suffix "_s" but then later rename it to without so need to change that name explicitly.

Here's the patch, but like I said, extremely specific and unlikely to be helpful for public consumption.

@Narthorn
Copy link

It looks like ldconfig expects .dynstr to be in the first LOAD segment (elf/readelf.c in glibc), although I don't know why.

@ghost
Copy link

ghost commented Feb 20, 2018

It looks like the code in readelflib.c simply searches for the very first section with type STRTAB, and uses that.

For me, patchelf seems to change the order of the sections, so e.g. before patchelf is applied, a shared library I have has the following section headers:

  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .note.gnu.build-id NOTE            00000000000001c8 0001c8 000024 00   A  0   0  4
  [ 2] .gnu.hash         GNU_HASH        00000000000001f0 0001f0 0001e8 00   A  3   0  8
  [ 3] .dynsym           DYNSYM          00000000000003d8 0003d8 001800 18   A  4   2  8
  [ 4] .dynstr           STRTAB          0000000000001bd8 001bd8 0011c1 00   A  0   0  1
  [ 5] .gnu.version      VERSYM          0000000000002d9a 002d9a 000200 02   A  3   0  2
  [ 6] .gnu.version_d    VERDEF          0000000000002fa0 002fa0 0000dc 00   A  4   7  8
  [ 7] .gnu.version_r    VERNEED         0000000000003080 003080 000140 00   A  4   7  8
  [ 8] .rela.dyn         RELA            00000000000031c0 0031c0 030b10 18   A  3   0  8
  [ 9] .rela.plt         RELA            0000000000033cd0 033cd0 001008 18   A  3  11  8
  [10] .init             PROGBITS        0000000000034cd8 034cd8 00000e 00  AX  0   0  4
  [11] .plt              PROGBITS        0000000000034cf0 034cf0 000ac0 10  AX  0   0 16
  [12] .text             PROGBITS        00000000000357b0 0357b0 7460b0 00  AX  0   0 16
  [13] .fini             PROGBITS        000000000077b860 77b860 000009 00  AX  0   0  4
  [14] .rodata           PROGBITS        000000000077b880 77b880 0c8da1 00   A  0   0 64
  [15] .eh_frame_hdr     PROGBITS        0000000000844624 844624 0132c4 00   A  0   0  4
  [16] .eh_frame         PROGBITS        00000000008578e8 8578e8 088b2c 00   A  0   0  8
  [17] .gcc_except_table PROGBITS        00000000008e0414 8e0414 00749c 00   A  0   0  4
  [18] .init_array       INIT_ARRAY      0000000000ae7ec8 8e7ec8 0000c0 00  WA  0   0  8
  [19] .fini_array       FINI_ARRAY      0000000000ae7f88 8e7f88 000008 00  WA  0   0  8
  [20] .jcr              PROGBITS        0000000000ae7f90 8e7f90 000008 00  WA  0   0  8
  [21] .data.rel.ro      PROGBITS        0000000000ae7fa0 8e7fa0 010538 00  WA  0   0 32
  [22] .dynamic          DYNAMIC         0000000000af84d8 8f84d8 000270 10  WA  4   0  8
  [23] .got              PROGBITS        0000000000af8748 8f8748 0008a0 08  WA  0   0  8
  [24] .data             PROGBITS        0000000000af9000 8f9000 012360 00  WA  0   0 32
  [25] .bss              NOBITS          0000000000b0b360 90b360 00fd40 00  WA  0   0 32
  [26] .gnu_debuglink    PROGBITS        0000000000000000 90b360 000018 00	0   0  1
  [27] .shstrtab         STRTAB          0000000000000000 90b378 00010d 00      0   0  1

so the .dynstr section (no. 4) is the first STRTAB, and the .shstrtab section (no. 27) is the second (and basically ignored by ldconfig).

But after setting a DT_RUNPATH entry with patchelf --set-rpath, the headers become:

  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00	0   0  0
  [ 1] .dynsym           DYNSYM          00000000000003d8 0003d8 001800 18   A 25   2  8
  [ 2] .gnu.version      VERSYM          0000000000002d9a 002d9a 000200 02   A  1   0  2
  [ 3] .gnu.version_d    VERDEF          0000000000002fa0 002fa0 0000dc 00   A 25   7  8
  [ 4] .gnu.version_r    VERNEED         0000000000003080 003080 000140 00   A 25   7  8
  [ 5] .rela.dyn         RELA            00000000000031c0 0031c0 030b10 18   A  1   0  8
  [ 6] .rela.plt         RELA            0000000000033cd0 033cd0 001008 18   A  1   8  8
  [ 7] .init             PROGBITS        0000000000034cd8 034cd8 00000e 00  AX  0   0  4
  [ 8] .plt              PROGBITS        0000000000034cf0 034cf0 000ac0 10  AX  0   0 16
  [ 9] .text             PROGBITS        00000000000357b0 0357b0 7460b0 00  AX  0   0 16
  [10] .fini             PROGBITS        000000000077b860 77b860 000009 00  AX  0   0  4
  [11] .rodata           PROGBITS        000000000077b880 77b880 0c8da1 00   A  0   0 64
  [12] .eh_frame_hdr     PROGBITS        0000000000844624 844624 0132c4 00   A  0   0  4
  [13] .eh_frame         PROGBITS        00000000008578e8 8578e8 088b2c 00   A  0   0  8
  [14] .gcc_except_table PROGBITS        00000000008e0414 8e0414 00749c 00   A  0   0  4
  [15] .init_array	 INIT_ARRAY	 0000000000ae7ec8 8e7ec8 0000c0 00  WA  0   0  8
  [16] .fini_array	 FINI_ARRAY	 0000000000ae7f88 8e7f88 000008 00  WA  0   0  8
  [17] .jcr              PROGBITS        0000000000ae7f90 8e7f90 000008 00  WA  0   0  8
  [18] .data.rel.ro	 PROGBITS        0000000000ae7fa0 8e7fa0 010538 00  WA  0   0 32
  [19] .got              PROGBITS        0000000000af8748 8f8748 0008a0 08  WA  0   0  8
  [20] .data             PROGBITS        0000000000af9000 8f9000 012360 00  WA  0   0 32
  [21] .bss              NOBITS          0000000000b0b360 90b360 00fd40 00  WA  0   0 32
  [22] .gnu_debuglink    PROGBITS        0000000000000000 90b360 000018 00	0   0  1
  [23] .shstrtab         STRTAB          0000000000000000 90b378 00010d 00	0   0  1
  [24] .dynamic          DYNAMIC         0000000000b1c000 90c000 000280 10  WA 25   0  8
  [25] .dynstr           STRTAB          0000000000b1c280 90c280 0011f9 00   A  0   0  8
  [26] .gnu.hash         GNU_HASH        0000000000b1d480 90d480 0001e8 00   A  1   0  8
  [27] .note.gnu.build-id NOTE            0000000000b1d668 90d668 000024 00   A  0   0  8

so now .shstrtab has become number 23, and moved before .dynstr, while patchelf has inserted the DT_RUNPATH entry into that table.

Apparently the readelf utility and the dynamic linker itself do not care about this different ordering, but ldconfig now uses the wrong string table, and it will always think the DT_RUNPATH string falls outside the range for that table.

@darealshinji
Copy link
Contributor Author

I may be wrong but I think I read somewhere that ELF specification doesn't require where the sections are written, so I guess readelf's and ld.so's behavior are right while ldconfig's behavior is a bug.

@ghost
Copy link

ghost commented Feb 20, 2018

Oh certainly, I agree, ldconfig should search specifically for .dynstr, or in fact maybe consider all string tables together. However, even if you would submit a glibc fix, and got it accepted, lots of distros out there come with a (very) old version, showing this error. (I think it also stops processing that particular library, which is annoying.)

@sjackman
Copy link

sjackman commented Feb 20, 2018

Good sleuthing, Dimitry! A patch upstream to Glibc is definitely warranted. In the mean time, a workaround for patchelf that ensures that .dynstr is the first STRTAB section would be useful. Thanks for sorting out the root cause!

@Des-Nerger
Copy link

Des-Nerger commented Apr 21, 2018

I don't think the issue is caused by the wrong order of .dynstr and .shstrtab. I forced patchelf to overwrite the .shstrtab section too, with the following hack:

--- patchelf_orig.cc	2018-04-21 15:39:40.057741000 +1000
+++ patchelf.cc	2018-04-21 16:16:20.097747164 +1000
@@ -618,6 +618,12 @@
     s.resize(size);
     replacedSections[sectionName] = s;
 
+    if (sectionName==".dynstr" && replacedSections.find(".shstrtab")==replacedSections.end()) {
+        Elf_Shdr & shdr = findSection(".shstrtab");
+        s = std::string((char *) contents + rdi(shdr.sh_offset), rdi(shdr.sh_size));
+        replacedSections[".shstrtab"] = s;
+    }
+
     return replacedSections[sectionName];
 }

The sections became reversed again but it didn't make ldconfig happy. Meanwhile, they had been written to a new separate segment LOAD at the end (which can be seen by readelf -l), so I suspect the @Narthorn 's version is more plausible.

@Flow86
Copy link

Flow86 commented Apr 24, 2018

is there any solution to fix this or work around that problem?

could it be that some string is missing?
if I try to read the rpath via "chrpath" utility, Ill get

RUNPATH string offset not contained in string table

@davidvandebunte
Copy link

davidvandebunte commented Jun 13, 2018

This is probably better described as an "ldconfig error" rather than an "ldconfig warning" as in the title. It prints to standard error and the dynamic loader can't find the libraries afterwards.

@averelld
Copy link

averelld commented Dec 8, 2018

Here's a small patch in case anyone else needs ldconfig to work:
NixOS/nixpkgs@d44a939#diff-64b83ddc8edce55f9aff3a4e639ce3bd

Basically as @Narthorn said, the .dynstr vaddr is resolved against the first LOAD segment, which doesn't work on any libs where patchelf called rewriteSections, because that moves .dynstr to the last LOAD segment.
Additionally I don't think it's possible to fix this in patchelf itself in the current implementation:

  • If soname gets longer, or rpath is added, dynstr cannot fit at it's old location.
  • LOAD segments have to be referenced in order of ascending vaddr in the header (I checked the specs)

@rcombs
Copy link

rcombs commented Mar 30, 2019

This seems like it's actually a bug in ldconfig. process_elf_file is assuming that the entire file will be mapped contiguously, which of course isn't required by the spec. It'd probably be worth filing against glibc.

@averelld
Copy link

It is, here's a bug report filed in December: https://sourceware.org/bugzilla/show_bug.cgi?id=23964. But it's probably not a priority, or at least there hasn't been any activity.

@haampie
Copy link
Contributor

haampie commented Mar 31, 2020

Not sure if this is the right place to ask, but does anybody know if this issue is being fixed in ldconfig upstream?

As I understand it, this is an issue already noted 10 years ago, e.g. here https://nix-dev.science.uu.narkive.com/q6Ww5fyO/ldconfig-problem-with-patchelf-and-64-bit-libs

@mikhailnov
Copy link

This problem exists in glibc 2.30 but does not in glibc 2.31, so this has probably been fixed in glibc upstream.

@mikhailnov
Copy link

[root@rosa-2019 lib64]# ldconfig -V | head -n 1
ldconfig (GNU libc) 2.31
[root@rosa-2019 lib64]# ldconfig -l libstdc++-gcc10.so.6.0.28
[root@rosa-2019 lib64]# 
user@pay2:/tmp$ LC_ALL=C ldconfig -V | head -n 1
ldconfig (Ubuntu GLIBC 2.30-0ubuntu2.1) 2.30
user@pay2:/tmp$ LC_ALL=C ldconfig -l libstdc++-gcc10.so.6.0.28
/sbin/ldconfig.real: file libstdc++-gcc10.so.6.0.28 is truncated

/sbin/ldconfig.real: No link created since soname could not be found for libstdc++-gcc10.so.6.0.28

@haampie
Copy link
Contributor

haampie commented Apr 7, 2020

Thanks, give it 3 more years and Ubuntu 18.04 is end of life, then we don't have to worry about this issue anymore 😅

@AaronDMarasco
Copy link

then we don't have to worry

<cries in CentOS 7>

@domenkozar
Copy link
Member

Given this is fixed in glibc I'm closing this issue.

@sjackman
Copy link

sjackman commented Jun 4, 2020

This issue has been fixed in glibc 2.31. #44 (comment)

glibc 2.31 is included in Ubuntu 20.04 and Fedora 32, but nothing older, in particular no stable release of either Debian or CentOS.
https://github.com/Linuxbrew/brew/wiki/Bottles#glibc-version

(for my and other's information)

@noloader
Copy link

Also see ldconfig and file xxx is truncated in Ubuntu's Launchpad.

wjt added a commit to endlessm/libmali-rockchip that referenced this issue Sep 3, 2020
This is lib/arm-linux-gnueabihf/libmali-midgard-t76x-r14p0-r0p0-x11.so
from https://github.com/rockchip-linux/libmali at revision b91d4b9.

Previously I had built that package and then extracted the libary from
libmali-midgard-t76x-r14p0-r0p0-x11-arm_1.9-1_armhf.deb. The two
binaries are not quite the same – the "compiled" one is 4096 bytes
larger. ldconfig doesn't like the "compiled" one, complaining:

    ldconfig: file /lib/arm-linux-gnueabihf/libmali.so.1 is truncated

In particular this seems to prevent GCompris – the second Flatpak app I
tried after LibreOffice – from starting.

Comparing the two with diffoscope (see below), we see that the
differences are:

- Some sections are reordered
- A .comment section is added
- 4096 bytes of 'X' have appeared

I believe from memory that the 'X's are added by Meson to leave space in
the ELF file to modify the rpath without relinking the file.

There are reports of glibc bugs that are triggered by rearranging
ELF files:

- https://sourceware.org/bugzilla/show_bug.cgi?id=23964
- https://github.com/NixOS/patchelf/issues/44

So, let's try just reusing the pristine object from Rockchip.

https://phabricator.endlessm.com/T29068

    --- tmp/usr/lib/mali/libmali.so.1.9.0
    +++ /sysroot/home/wjt/src/rockchip-linux/libmali/lib/arm-linux-gnueabihf/libmali-midgard-t76x-r14p0-r0p0-x11.so
    ├── readelf --wide --file-header {}
    │ @@ -6,15 +6,15 @@
    │    OS/ABI:                            UNIX - System V
    │    ABI Version:                       0
    │    Type:                              DYN (Shared object file)
    │    Machine:                           ARM
    │    Version:                           0x1
    │    Entry point address:               0xa0c10
    │    Start of program headers:          52 (bytes into file)
    │ -  Start of section headers:          18590608 (bytes into file)
    │ +  Start of section headers:          18560696 (bytes into file)
    │    Flags:                             0x5000402, Version5 EABI, hard-float ABI, <unknown>
    │    Size of this header:               52 (bytes)
    │    Size of program headers:           32 (bytes)
    │    Number of program headers:         8
    │    Size of section headers:           40 (bytes)
    │ -  Number of section headers:         29
    │ -  Section header string table index: 28
    │ +  Number of section headers:         30
    │ +  Section header string table index: 26
    ├── readelf --wide --program-header {}
    │ @@ -3,15 +3,15 @@
    │  Entry point 0xa0c10
    │  There are 8 program headers, starting at offset 52
    │
    │  Program Headers:
    │    Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
    │    LOAD           0x000000 0x00000000 0x00000000 0x1133d64 0x1133d64 R E 0x10000
    │    GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x10
    │ -  NOTE           0x000000 0x00000000 0x00000114 0x00000 0x00000 R   0x4
    │ +  NOTE           0x000114 0x00000114 0x00000114 0x00024 0x00024 R   0x4
    │    EXIDX          0x11313a0 0x011313a0 0x011313a0 0x029c0 0x029c0 R   0x4
    │    LOAD           0x1134000 0x01144000 0x01144000 0x7f550 0x8c574 RW  0x10000
    │    TLS            0x1134000 0x01144000 0x01144000 0x00000 0x00004 R   0x4
    │    DYNAMIC        0x11b4000 0x011d1000 0x011d1000 0x00160 0x00160 RW  0x4
    │    LOAD           0x11b4000 0x011d1000 0x011d1000 0x06a54 0x06a54 RW  0x1000
    │
    │   Section to Segment mapping:
    ├── readelf --wide --sections {}
    │ @@ -1,38 +1,39 @@
    │ -There are 29 section headers, starting at offset 0x11bab90:
    │ +There are 30 section headers, starting at offset 0x11b36b8:
    │
    │  Section Headers:
    │    [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
    │    [ 0]                   NULL            00000000 000000 000000 00      0   0  0
    │    [ 1] .hash             HASH            00000138 000138 0025c0 04   A  2   0  4
    │ -  [ 2] .dynsym           DYNSYM          000026f8 0026f8 005670 10   A 26   3  4
    │ +  [ 2] .dynsym           DYNSYM          000026f8 0026f8 005670 10   A 28   3  4
    │    [ 3] .gnu.version      VERSYM          0000e62c 00e62c 000ace 02   A  2   0  2
    │ -  [ 4] .gnu.version_d    VERDEF          0000f0fc 00f0fc 000038 00   A 26   2  4
    │ -  [ 5] .gnu.version_r    VERNEED         0000f134 00f134 0001b0 00   A 26   8  4
    │ +  [ 4] .gnu.version_d    VERDEF          0000f0fc 00f0fc 000038 00   A 28   2  4
    │ +  [ 5] .gnu.version_r    VERNEED         0000f134 00f134 0001b0 00   A 28   8  4
    │    [ 6] .rel.dyn          REL             0000f2e4 00f2e4 08fc78 08   A  2   0  4
    │ -  [ 7] .rel.plt          REL             0009ef5c 09ef5c 000b38 08  AI  2  21  4
    │ +  [ 7] .rel.plt          REL             0009ef5c 09ef5c 000b38 08   A  2   9  4
    │    [ 8] .init             PROGBITS        0009fa94 09fa94 00000c 00  AX  0   0  4
    │    [ 9] .plt              PROGBITS        0009faa0 09faa0 001170 04  AX  0   0  4
    │    [10] .text             PROGBITS        000a0c10 0a0c10 dfc268 00  AX  0   0 16
    │    [11] .fini             PROGBITS        00e9ce78 e9ce78 000008 00  AX  0   0  4
    │    [12] .rodata           PROGBITS        00e9ce80 e9ce80 28e10c 00   A  0   0  8
    │    [13] .ARM.extab        PROGBITS        0112af8c 112af8c 006414 00   A  0   0  4
    │    [14] .ARM.exidx        ARM_EXIDX       011313a0 11313a0 0029c0 00  AL 10   0  4
    │    [15] .eh_frame         PROGBITS        01133d60 1133d60 000004 00   A  0   0  4
    │    [16] .tbss             NOBITS          01144000 1134000 000004 00 WAT  0   0  4
    │ -  [17] .init_array       INIT_ARRAY      01144000 1134000 000108 04  WA  0   0  4
    │ -  [18] .fini_array       FINI_ARRAY      01144108 1134108 000008 04  WA  0   0  4
    │ +  [17] .init_array       INIT_ARRAY      01144000 1134000 000108 00  WA  0   0  4
    │ +  [18] .fini_array       FINI_ARRAY      01144108 1134108 000008 00  WA  0   0  4
    │    [19] .jcr              PROGBITS        01144110 1134110 000004 00  WA  0   0  4
    │    [20] .data.rel.ro      PROGBITS        01144118 1134118 05b248 00  WA  0   0  8
    │    [21] .got              PROGBITS        0119f4b8 118f4b8 0011d0 04  WA  0   0  4
    │    [22] .data             PROGBITS        011a0688 1190688 022ec8 00  WA  0   0  8
    │ -  [23] .bss              NOBITS          011c3550 11b3550 00d024 00  WA  0   0  8
    │ -  [24] .ARM.attributes   ARM_ATTRIBUTES  00000000 11baa54 000035 00      0   0  1
    │ -  [25] .dynamic          DYNAMIC         011d1000 11b4000 000160 08  WA 26   0  4
    │ -  [26] .dynstr           STRTAB          011d1160 11b4160 0068d0 00   A  0   0  4
    │ -  [27] .note.gnu.build-id NOTE            011d7a30 11baa30 000024 00   A  0   0  4
    │ -  [28] .shstrtab         STRTAB          00000000 11baa89 000104 00      0   0  1
    │ +  [23] .comment          PROGBITS        00000000 11b3550 000024 01  MS  0   0  1
    │ +  [24] .bss              NOBITS          011c3550 11b3550 00d024 00  WA  0   0  8
    │ +  [25] .ARM.attributes   ARM_ATTRIBUTES  00000000 11b3574 000035 00      0   0  1
    │ +  [26] .shstrtab         STRTAB          00000000 11b35a9 00010d 00      0   0  1
    │ +  [27] .dynamic          DYNAMIC         011d1000 11b4000 000160 08  WA 28   0  4
    │ +  [28] .dynstr           STRTAB          011d1160 11b4160 0068d0 00   A  0   0  4
    │ +  [29] .note.gnu.build-id NOTE            011d7a30 11baa30 000024 00   A  0   0  4
    │  Key to Flags:
    │    W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
    │    L (link order), O (extra OS processing required), G (group), T (TLS),
    │    C (compressed), x (unknown), o (OS specific), E (exclude),
    │    y (purecode), p (processor specific)
    ├── readelf --wide --version-info {}
    │ @@ -345,20 +345,20 @@
    │    554:   0 (*local*)       3 (GLIBC_2.4)     1 (*global*)      1 (*global*)
    │    558:   1 (*global*)      1 (*global*)      1 (*global*)      1 (*global*)
    │    55c:   1 (*global*)      1 (*global*)      1 (*global*)      1 (*global*)
    │    560:   d (GLIBC_2.4)     b (GLIBCXX_3.4.9)   1 (*global*)      3 (GLIBC_2.4)
    │    564:   1 (*global*)      4 (GLIBCXX_3.4)   1 (*global*)
    │
    │  Version definition section '.gnu.version_d' contains 2 entries:
    │ - Addr: 0x000000000000f0fc  Offset: 0x00f0fc  Link: 26 (.dynstr)
    │ + Addr: 0x000000000000f0fc  Offset: 0x00f0fc  Link: 28 (.dynstr)
    │    000000: Rev: 1  Flags: BASE  Index: 1  Cnt: 1  Name: libmali.so
    │    0x001c: Rev: 1  Flags: none  Index: 2  Cnt: 1  Name: LIBMALI_1.0
    │
    │  Version needs section '.gnu.version_r' contains 8 entries:
    │ - Addr: 0x000000000000f134  Offset: 0x00f134  Link: 26 (.dynstr)
    │ + Addr: 0x000000000000f134  Offset: 0x00f134  Link: 28 (.dynstr)
    │    000000: Version: 1  File: ld-linux-armhf.so.3  Cnt: 1
    │    0x0010:   Name: GLIBC_2.4  Flags: none  Version: 20
    │    0x0020: Version: 1  File: librt.so.1  Cnt: 1
    │    0x0030:   Name: GLIBC_2.4  Flags: none  Version: 16
    │    0x0040: Version: 1  File: libdl.so.2  Cnt: 1
    │    0x0050:   Name: GLIBC_2.4  Flags: none  Version: 13
    │    0x0060: Version: 1  File: libpthread.so.0  Cnt: 1
    ├── strings --all {}
    │ @@ -1,7 +1,9 @@
    │ +XXXX
    │ +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    │  "3F2t(FO
    │  KpG-
    │  #9hc
    │  F8hL
    │  H{DyDxD
    │  E!F*F,D
    │  E F*F,D
    │ @@ -217401,21 +217403,52 @@
    │  d	,:
    │  e	,:
    │  f	,:
    │  g	,:
    │  h	,:
    │  i	,:
    │  j	,:
    │ +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`
    │  INFO
    │  WARN
    │  ERROR
    │  FAIL
    │  g++ (Ubuntu 4.9.3-13ubuntu2) 4.9.3
    │  profile=tx011-release gpu=t76x hwver=r0p0 kernel_modules=0 progs_install=bin libs_install=bin floatabi=hard winsys=fbdev os=linux toolchain_prefix_target=/home/lihuang/project/linux_mali/midgard/driver/product/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- winsys_dma_buf=1 simd=1 symbols=0 wayland_server=0 ump=0 cl=1 opencl_platform_config=config_t6xx winsys=gbm allocator=drm_dumb winsys=x11,gbm cl=1
    │  a79caef8f5df9db3a4dcede1f163d679bd864dff
    │ +GCC: (Linaro GCC 4.9-2017.01) 4.9.4
    │ +aeabi
    │ +.shstrtab
    │ +.note.gnu.build-id
    │ +.hash
    │ +.dynsym
    │ +.dynstr
    │ +.gnu.version
    │ +.gnu.version_d
    │ +.gnu.version_r
    │ +.rel.dyn
    │ +.rel.plt
    │ +.init
    │ +.text
    │ +.fini
    │ +.rodata
    │ +.ARM.extab
    │ +.ARM.exidx
    │ +.eh_frame
    │ +.tbss
    │ +.init_array
    │ +.fini_array
    │ +.jcr
    │ +.data.rel.ro
    │ +.dynamic
    │ +.got
    │ +.data
    │ +.bss
    │ +.comment
    │ +.ARM.attributes
    │  __gmon_start__
    │  _fini
    │  _ITM_deregisterTMCloneTable
    │  _ITM_registerTMCloneTable
    │  __cxa_finalize
    │  _Jv_RegisterClasses
    │  getpid
    │ @@ -218779,35 +218812,7 @@
    │  GLIBCXX_3.4.15
    │  CXXABI_1.3
    │  GLIBCXX_3.4.20
    │  GLIBCXX_3.4
    │  GLIBC_2.7
    │  GLIBC_2.15
    │  libmali.so.1
    │ -aeabi
    │ -.shstrtab
    │ -.hash
    │ -.dynsym
    │ -.gnu.version
    │ -.gnu.version_d
    │ -.gnu.version_r
    │ -.rel.dyn
    │ -.rel.plt
    │ -.init
    │ -.text
    │ -.fini
    │ -.rodata
    │ -.ARM.extab
    │ -.ARM.exidx
    │ -.eh_frame
    │ -.tbss
    │ -.init_array
    │ -.fini_array
    │ -.jcr
    │ -.data.rel.ro
    │ -.got
    │ -.data
    │ -.bss
    │ -.ARM.attributes
    │ -.dynamic
    │ -.dynstr
    │ -.note.gnu.build-id
    ├── readelf --wide --decompress --hex-dump=.plt {}
    │ @@ -1,9 +1,10 @@
    │
    │  Hex dump of section '.plt':
    │ + NOTE: This section has relocations against it, but these have NOT been applied to this dump.
    │    0x0009faa0 04e02de5 04e09fe5 0ee08fe0 08f0bee5 ..-.............
    │    0x0009fab0 08fa0f01 10c68fe2 ffca8ce2 08fabce5 ................
    │    0x0009fac0 10c68fe2 ffca8ce2 00fabce5 10c68fe2 ................
    │    0x0009fad0 ffca8ce2 f8f9bce5 10c68fe2 ffca8ce2 ................
    │    0x0009fae0 f0f9bce5 10c68fe2 ffca8ce2 e8f9bce5 ................
    │    0x0009faf0 10c68fe2 ffca8ce2 e0f9bce5 10c68fe2 ................
    │    0x0009fb00 ffca8ce2 d8f9bce5 10c68fe2 ffca8ce2 ................
    ├── readelf --wide --decompress --hex-dump=.got {}
    │ @@ -1,10 +1,9 @@
    │
    │  Hex dump of section '.got':
    │ - NOTE: This section has relocations against it, but these have NOT been applied to this dump.
    │    0x0119f4b8 60f31901 00000000 00000000 a0fa0900 `...............
    │    0x0119f4c8 a0fa0900 a0fa0900 a0fa0900 a0fa0900 ................
    │    0x0119f4d8 a0fa0900 a0fa0900 a0fa0900 a0fa0900 ................
    │    0x0119f4e8 a0fa0900 a0fa0900 a0fa0900 a0fa0900 ................
    │    0x0119f4f8 a0fa0900 a0fa0900 a0fa0900 a0fa0900 ................
    │    0x0119f508 a0fa0900 a0fa0900 a0fa0900 a0fa0900 ................
    │    0x0119f518 a0fa0900 a0fa0900 a0fa0900 a0fa0900 ................
    ├── readelf --wide --decompress --hex-dump=.shstrtab {}
    │ @@ -1,20 +1,20 @@
    │
    │  Hex dump of section '.shstrtab':
    │ -  0x00000000 002e7368 73747274 6162002e 68617368 ..shstrtab..hash
    │ -  0x00000010 002e6479 6e73796d 002e676e 752e7665 ..dynsym..gnu.ve
    │ -  0x00000020 7273696f 6e002e67 6e752e76 65727369 rsion..gnu.versi
    │ -  0x00000030 6f6e5f64 002e676e 752e7665 7273696f on_d..gnu.versio
    │ -  0x00000040 6e5f7200 2e72656c 2e64796e 002e7265 n_r..rel.dyn..re
    │ -  0x00000050 6c2e706c 74002e69 6e697400 2e746578 l.plt..init..tex
    │ -  0x00000060 74002e66 696e6900 2e726f64 61746100 t..fini..rodata.
    │ -  0x00000070 2e41524d 2e657874 6162002e 41524d2e .ARM.extab..ARM.
    │ -  0x00000080 65786964 78002e65 685f6672 616d6500 exidx..eh_frame.
    │ -  0x00000090 2e746273 73002e69 6e69745f 61727261 .tbss..init_arra
    │ -  0x000000a0 79002e66 696e695f 61727261 79002e6a y..fini_array..j
    │ -  0x000000b0 6372002e 64617461 2e72656c 2e726f00 cr..data.rel.ro.
    │ -  0x000000c0 2e676f74 002e6461 7461002e 62737300 .got..data..bss.
    │ -  0x000000d0 2e41524d 2e617474 72696275 74657300 .ARM.attributes.
    │ -  0x000000e0 2e64796e 616d6963 002e6479 6e737472 .dynamic..dynstr
    │ -  0x000000f0 002e6e6f 74652e67 6e752e62 75696c64 ..note.gnu.build
    │ -  0x00000100 2d696400                            -id.
    │ +  0x00000000 002e7368 73747274 6162002e 6e6f7465 ..shstrtab..note
    │ +  0x00000010 2e676e75 2e627569 6c642d69 64002e68 .gnu.build-id..h
    │ +  0x00000020 61736800 2e64796e 73796d00 2e64796e ash..dynsym..dyn
    │ +  0x00000030 73747200 2e676e75 2e766572 73696f6e str..gnu.version
    │ +  0x00000040 002e676e 752e7665 7273696f 6e5f6400 ..gnu.version_d.
    │ +  0x00000050 2e676e75 2e766572 73696f6e 5f72002e .gnu.version_r..
    │ +  0x00000060 72656c2e 64796e00 2e72656c 2e706c74 rel.dyn..rel.plt
    │ +  0x00000070 002e696e 6974002e 74657874 002e6669 ..init..text..fi
    │ +  0x00000080 6e69002e 726f6461 7461002e 41524d2e ni..rodata..ARM.
    │ +  0x00000090 65787461 62002e41 524d2e65 78696478 extab..ARM.exidx
    │ +  0x000000a0 002e6568 5f667261 6d65002e 74627373 ..eh_frame..tbss
    │ +  0x000000b0 002e696e 69745f61 72726179 002e6669 ..init_array..fi
    │ +  0x000000c0 6e695f61 72726179 002e6a63 72002e64 ni_array..jcr..d
    │ +  0x000000d0 6174612e 72656c2e 726f002e 64796e61 ata.rel.ro..dyna
    │ +  0x000000e0 6d696300 2e676f74 002e6461 7461002e mic..got..data..
    │ +  0x000000f0 62737300 2e636f6d 6d656e74 002e4152 bss..comment..AR
    │ +  0x00000100 4d2e6174 74726962 75746573 00       M.attributes.

Previously I had copied the libmali.so.1[.9.0] from the result of
building
commit 1fb6b47b287252f16bf06dc7bd87611c378de0cf
Author: Will Thompson <wjt@endlessm.com>
Date:   Wed Sep 2 10:08:30 2020 +0100

    Update to newer Mali

    I obtained these files as follows:

    - Built https://github.com/rockchip-linux/libmali @ b91d4b9
    - Unpacked libmali-midgard-t76x-r14p0-r0p0-x11-arm_1.9-1_armhf.deb
    - Copied the files into here

    In the previous version, all libraries were symlinks to libMali.so (capital M):

        wjt@jerry:~$ ls -l /usr/lib/mali-t76x/arm-linux-gnueabihf/
        total 18132
        drwxr-xr-x  2 root root     4096 Jan  1  1970 flatpak
        lrwxrwxrwx 25 root root       10 Sep 25  2019 libEGL.so.1 -> libMali.so
        lrwxrwxrwx 25 root root       10 Sep 25  2019 libEGL.so.1.0.0 -> libMali.so
        lrwxrwxrwx 25 root root       10 Sep 25  2019 libgbm.so.1 -> libMali.so
        lrwxrwxrwx 25 root root       10 Sep 25  2019 libgbm.so.1.0.0 -> libMali.so
        lrwxrwxrwx 25 root root       10 Sep 25  2019 libGLESv2.so.2 -> libMali.so
        lrwxrwxrwx 25 root root       10 Sep 25  2019 libGLESv2.so.2.0.0 -> libMali.so
        -rw-r--r--  5 root root 18561828 Jan  1  1970 libMali.so

    In this version, all these libraries actually exist, as very small
    libraries which in turn link to libmali.so (lowercase m):

        wjt@jerry:~$ ls -l tmp/usr/lib/mali/
        total 18220
        lrwxrwxrwx 1 wjt wjt       11 Jul 29 04:35 libEGL.so -> libEGL.so.1
        -rw-r--r-- 1 wjt wjt     5372 Jul 29 04:35 libEGL.so.1
        lrwxrwxrwx 1 wjt wjt       11 Jul 29 04:35 libgbm.so -> libgbm.so.1
        -rw-r--r-- 1 wjt wjt     5452 Jul 29 04:35 libgbm.so.1
        lrwxrwxrwx 1 wjt wjt       17 Jul 29 04:35 libGLESv1_CM.so -> libGLESv1_CM.so.1
        -rw-r--r-- 1 wjt wjt     5372 Jul 29 04:35 libGLESv1_CM.so.1
        lrwxrwxrwx 1 wjt wjt       14 Jul 29 04:35 libGLESv2.so -> libGLESv2.so.2
        -rw-r--r-- 1 wjt wjt     5372 Jul 29 04:35 libGLESv2.so.2
        lrwxrwxrwx 1 wjt wjt       10 Jul 29 04:35 libmali-midgard-t76x-r14p0-r0p0-x11.so -> libmali.so
        lrwxrwxrwx 1 wjt wjt       18 Jul 29 04:35 libMaliOpenCL.so -> libMaliOpenCL.so.1
        -rw-r--r-- 1 wjt wjt     5372 Jul 29 04:35 libMaliOpenCL.so.1
        lrwxrwxrwx 1 wjt wjt       12 Jul 29 04:35 libmali.so -> libmali.so.1
        lrwxrwxrwx 1 wjt wjt       12 Jul 29 04:35 libMali.so -> libMali.so.1
        lrwxrwxrwx 1 wjt wjt       16 Jul 29 04:35 libmali.so.1 -> libmali.so.1.9.0
        -rw-r--r-- 1 wjt wjt     5372 Jul 29 04:35 libMali.so.1
        -rw-r--r-- 1 wjt wjt 18591768 Jul 29 04:35 libmali.so.1.9.0
        lrwxrwxrwx 1 wjt wjt       14 Jul 29 04:35 libOpenCL.so -> libOpenCL.so.1
        -rw-r--r-- 1 wjt wjt     5372 Jul 29 04:35 libOpenCL.so.1
        drwxr-xr-x 2 wjt wjt     4096 Jul 29 04:35 pkgconfig

    For example:

        wjt@jerry:~$ ldd tmp/usr/lib/mali/libgbm.so
            linux-vdso.so.1 (0xbef7d000)
            libmali.so.1 => not found
            libdrm.so.2 => /lib/arm-linux-gnueabihf/libdrm.so.2 (0xb6f01000)
            libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6e07000)
            /lib/ld-linux-armhf.so.3 (0xb6f42000)
            libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6d8c000)

    Crucially this libgbm includes a (stub) implementation of
    gbm_surface_create_with_modifiers() which Mutter requires but the old
    libMali.so did not implement.

    We have to install a libmali.so.1 symlink into
    /usr/lib/arm-linux-gnueabihf because executables which link against
    libEGL now transitively link against this. I renamed libmali.so.1.9.0
    (as built by Rockchip's package) to libmali.so.1 to simplify this. I'm
    sure I have not done this the Correct Way.

    With this patch GDM and my user session come up. However, ldconfig
    complains:

        ldconfig: file /lib/arm-linux-gnueabihf/libmali.so.1 is truncated

    and a similar message when launching Flatpaks. gnome-session-binary,
    mutter, etc. seem to come up fine so I don't know what the deal is here.

    https://phabricator.endlessm.com/T29068

diff --git a/debian/changelog b/debian/changelog
index a00526d..76e20df 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+mali-t76x-drivers-x11 (14.0.0.0-2) eos3.6; urgency=medium
+
+  * Update from
+    libmali-midgard-t76x-r14p0-r0p0-x11-arm_1.9-1_armhf.deb
+
+ -- Will Thompson <wjt@endlessm.com>  Wed, 02 Sep 2020 10:13:29 +0100
+
 mali-t76x-drivers-x11 (14.0.0.0-1) master; urgency=medium

   * Initial packaging from
diff --git a/debian/mali-t76x-corelibs.links b/debian/mali-t76x-corelibs.links
index e68a2f4..06c2cae 100644
--- a/debian/mali-t76x-corelibs.links
+++ b/debian/mali-t76x-corelibs.links
@@ -1,13 +1,9 @@
-usr/lib/mali-t76x/arm-linux-gnueabihf/libMali.so		usr/lib/mali-t76x/arm-linux-gnueabihf/libEGL.so.1
-usr/lib/mali-t76x/arm-linux-gnueabihf/libMali.so		usr/lib/mali-t76x/arm-linux-gnueabihf/libEGL.so.1.0.0
-usr/lib/mali-t76x/arm-linux-gnueabihf/libMali.so		usr/lib/mali-t76x/arm-linux-gnueabihf/libgbm.so.1
-usr/lib/mali-t76x/arm-linux-gnueabihf/libMali.so		usr/lib/mali-t76x/arm-linux-gnueabihf/libgbm.so.1.0.0
-usr/lib/mali-t76x/arm-linux-gnueabihf/libMali.so		usr/lib/mali-t76x/arm-linux-gnueabihf/libGLESv2.so.2
-usr/lib/mali-t76x/arm-linux-gnueabihf/libMali.so		usr/lib/mali-t76x/arm-linux-gnueabihf/libGLESv2.so.2.0.0
-usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libMali.so	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libEGL.so.1
-usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libMali.so	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libEGL.so.1.0.0
-usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libMali.so	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libgbm.so.1
-usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libMali.so	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libgbm.so.1.0.0
-usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libMali.so	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libGLESv2.so.2
-usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libMali.so	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libGLESv2.so.2.0.0
+usr/lib/mali-t76x/arm-linux-gnueabihf/libEGL.so.1		usr/lib/mali-t76x/arm-linux-gnueabihf/libEGL.so.1.0.0
+usr/lib/mali-t76x/arm-linux-gnueabihf/libgbm.so.1		usr/lib/mali-t76x/arm-linux-gnueabihf/libgbm.so.1.0.0
+usr/lib/mali-t76x/arm-linux-gnueabihf/libGLESv2.so.2		usr/lib/mali-t76x/arm-linux-gnueabihf/libGLESv2.so.2.0.0
+usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libEGL.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libEGL.so.1.0.0
+usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libgbm.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libgbm.so.1.0.0
+usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libGLESv2.so.2	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libGLESv2.so.2.0.0
 usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak			usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/lib
+usr/lib/mali-t76x/arm-linux-gnueabihf/libmali.so.1		usr/lib/arm-linux-gnueabihf/libmali.so.1
+
diff --git a/debian/mali-t76x-drivers-rk3288.install b/debian/mali-t76x-drivers-rk3288.install
index a7cdbe4..1bcb435 100644
--- a/debian/mali-t76x-drivers-rk3288.install
+++ b/debian/mali-t76x-drivers-rk3288.install
@@ -1,2 +1,10 @@
-drivers/rk3288/libMali.so		usr/lib/mali-t76x/arm-linux-gnueabihf/
-drivers/rk3288/libMali.so		usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/
+drivers/rk3288/libEGL.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/
+drivers/rk3288/libEGL.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/
+drivers/rk3288/libgbm.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/
+drivers/rk3288/libgbm.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/
+drivers/rk3288/libGLESv2.so.2	usr/lib/mali-t76x/arm-linux-gnueabihf/
+drivers/rk3288/libGLESv2.so.2	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/
+drivers/rk3288/libMali.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/
+drivers/rk3288/libMali.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/
+drivers/rk3288/libmali.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/
+drivers/rk3288/libmali.so.1	usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/
diff --git a/debian/rules b/debian/rules
index 2d33f6a..32496f3 100755
--- a/debian/rules
+++ b/debian/rules
@@ -2,3 +2,7 @@

 %:
 	dh $@
+
+# Libraries all link to each other, so need to tell dpkg-shlibdeps where they live
+override_dh_shlibdeps:
+	dh_shlibdeps -l/usr/lib/mali-t76x/arm-linux-gnueabihf
diff --git a/drivers/rk3288/libEGL.so.1 b/drivers/rk3288/libEGL.so.1
new file mode 100644
index 0000000..444c9b7
Binary files /dev/null and b/drivers/rk3288/libEGL.so.1 differ
diff --git a/drivers/rk3288/libGLESv2.so.2 b/drivers/rk3288/libGLESv2.so.2
new file mode 100644
index 0000000..af96aa5
Binary files /dev/null and b/drivers/rk3288/libGLESv2.so.2 differ
diff --git a/drivers/rk3288/libMali.so.1 b/drivers/rk3288/libMali.so.1
new file mode 100644
index 0000000..ed98243
Binary files /dev/null and b/drivers/rk3288/libMali.so.1 differ
diff --git a/drivers/rk3288/libgbm.so.1 b/drivers/rk3288/libgbm.so.1
new file mode 100644
index 0000000..0bfa4c2
Binary files /dev/null and b/drivers/rk3288/libgbm.so.1 differ
diff --git a/drivers/rk3288/libMali.so b/drivers/rk3288/libmali.so.1
similarity index 77%
rename from drivers/rk3288/libMali.so
rename to drivers/rk3288/libmali.so.1
index 83c1c75..c9344b6 100644
Binary files a/drivers/rk3288/libMali.so and b/drivers/rk3288/libmali.so.1 differ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests