ALT Linux Team development discussions
 help / color / mirror / Atom feed
From: Sergey Vlasov <vsu@altlinux.ru>
To: devel@lists.altlinux.org
Subject: Re: [devel] libc on i586: WTF?
Date: Sat, 16 Oct 2010 15:40:16 +0400
Message-ID: <20101016114016.GA6758@atlas.home> (raw)
In-Reply-To: <4CB9296A.2000406@mmedia2.kemsu.ru>

[-- Attachment #1: Type: text/plain, Size: 2211 bytes --]

On Sat, Oct 16, 2010 at 12:26:18PM +0800, REAL wrote:
> Что-то загадочное произошло на вчерашнем срезе сизифа (может быть и 
> раньше так было, только не замечал):
> 
> $ gfortran -O2 -c ilaenv.f
> $ nm ilaenv.o|grep stack_chk_fail
>                   U __stack_chk_fail
> 
> НО:
> $ gfortran -fPIC -O2 -c ilaenv.f
> $ nm ilaenv.o|grep stack_chk_fail
>                   U __stack_chk_fail_local
> 
> Проявляется на i586, на x86_64 всё в порядке.

На самом деле так было уже очень давно.

> Символ __stack_chk_fail_local присутствует только в libc.a, не в libc.so:

Ещё он присутствует в libc_nonshared.a, при этом файл libc.so,
используемый при компоновке, на самом деле представляет собой ld
script:

/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf32-i386)
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a  AS_NEEDED ( /lib/ld-linux.so.2 ) )

Т.е., в каждый исполняемый файл или разделяемую библиотеку попадает
собственная копия необходимых функций из libc_nonshared.a.

Функция __stack_chk_fail_local на самом деле просто вызывает функцию
__stack_chk_fail из libc.so.6.  Эта промежуточная функция, локальная
для разделяемой библиотеки, добавлена с целью оптимизации.  Дело в
том, что вызов функции __stack_chk_fail из другого модуля должен
производиться через PLT, для чего i386 ELF ABI требует перед вызовом
загрузить в регистр %ebx указатель на GOT; вызов же локальной для
модуля функции __stack_chk_fail_local может производиться напрямую и
не требует предварительной инициализации %ebx, а уже в реализации
__stack_chk_fail_local в одном экземпляре на каждый модуль
присутствует код, устанавливающий требуемое значение %ebx перед
вызовом __stack_chk_fail через PLT.

В системе команд x86_64, в отличие от i386, есть возможность адресации
данных по смещению от адреса текущей команды (%rip), поэтому не
требуется занимать отдельный регистр для хранения адреса GOT, и вызов
функции через PLT не требует предварительной подготовки, поэтому там
функция __stack_chk_fail просто вызывается напрямую, и локальная для
модуля функция __stack_chk_fail_local не нужна.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

  parent reply	other threads:[~2010-10-16 11:40 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-10-16  4:26 REAL
2010-10-16 11:18 ` Dmitry V. Levin
2010-10-18  3:32   ` REAL
2010-10-18  8:19     ` Dmitry V. Levin
2010-10-16 11:40 ` Sergey Vlasov [this message]
2010-10-18  3:37   ` REAL
2010-10-18  8:20     ` Dmitry V. Levin
2010-10-18  7:33       ` REAL

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20101016114016.GA6758@atlas.home \
    --to=vsu@altlinux.ru \
    --cc=devel@lists.altlinux.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git