From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on sa.local.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-4.3 required=5.0 tests=ALL_TRUSTED,BAYES_00, RP_MATCHES_RCVD autolearn=unavailable autolearn_force=no version=3.4.1 To: devel@lists.altlinux.org References: <20200622104109.GA16954@imap.altlinux.org> <048dc43b-7585-02df-41b5-48be0ea73e78@basealt.ru> <98c5fdf0-c4bb-cc19-cf81-fd9e2f011e03@basealt.ru> From: Alexey Sheplyakov Message-ID: Date: Tue, 23 Jun 2020 02:01:14 +0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.8.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=koi8-r; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit Subject: Re: [devel] armh + libjpeg + c++ exceptions X-BeenThere: devel@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: ALT Linux Team development discussions List-Id: ALT Linux Team development discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 22 Jun 2020 22:01:18 -0000 Archived-At: List-Archive: List-Post: On 6/22/20 7:46 PM, Alexey Sheplyakov wrote: > On 6/22/20 7:27 PM, Alexey Sheplyakov wrote: > >> Нельзя просто так взять и заставить C код бросать (C++) исключения. >> Как минимум нужно >> >> 1) использовать для линковки g++ (не всегда >> эквивалентно gcc -x c++ -lstdc++) >> 2) все задействованные библиотеки собирать так, чтоб в них был >> GNU_EH_FRAME >> >> А у нас в armh его нет: > > И не только у нас нет. Возможно, это ABI такой. Продолжаю курить > документацию. arm использует другой механизм разматывания стека при обработке исключений. Для того, чтобы его задействовать (в C приложениях и библиотеках), нужно собирать с опцией -funwind-tables, (и само приложение, и все библиотеки, которые могут оказаться в callchain исключения). Проверить, собрана ли библиотека/приложение нужным образом, можно командой readelf -l path/to/libthat.so | grep EXIDX Если молчит -- значит, библиотека исключения не поддерживает. $ readelf -l usr/lib/libjpeg.so.62 Elf file type is DYN (Shared object file) Entry point 0x1a50 There are 6 program headers, starting at offset 52 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000000 0x00000000 0x00000000 0x28ca4 0x28ca4 R E 0x10000 LOAD 0x028d00 0x00038d00 0x00038d00 0x00498 0x0049c RW 0x10000 DYNAMIC 0x028f10 0x00038f10 0x00038f10 0x000f0 0x000f0 RW 0x4 NOTE 0x0000f4 0x000000f4 0x000000f4 0x00024 0x00024 R 0x4 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x10 GNU_RELRO 0x028d00 0x00038d00 0x00038d00 0x00300 0x00300 R 0x1 Section to Segment mapping: Segment Sections... 00 .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .eh_frame 01 .init_array .fini_array .data.rel.ro .dynamic .got .bss 02 .dynamic 03 .note.gnu.build-id 04 05 .init_array .fini_array .data.rel.ro .dynamic т.е. наш libjpeg исключения не поддерживает. Что и подтверждает пример из https://bugzilla.redhat.com/show_bug.cgi?id=101448 Что со всем этим делать? 1. Выяснить, каковы накладные расходы на поддержку исключений 2. Решить, приемлемы ли они 3. Если да, то собрать GCC так, чтобы -funwind-tables была по умолчанию 4. Если нет, то перестать бросать исключения их C программ, или включать -funwind-tables только там, где без исключений никак не обойтись.