From mboxrd@z Thu Jan 1 00:00:00 1970 From: ludo@gnu.org (Ludovic =?UTF-8?Q?Court=C3=A8s?=) Subject: bug#30820: Chunked store references in compiled code break grafting (again) Date: Wed, 14 Mar 2018 18:24:48 +0100 Message-ID: <87efkm7eov.fsf@gnu.org> References: <87o9jq7j7r.fsf@gnu.org> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:33119) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ewA9B-0000NZ-MK for bug-guix@gnu.org; Wed, 14 Mar 2018 13:25:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ewA98-00086s-Gy for bug-guix@gnu.org; Wed, 14 Mar 2018 13:25:05 -0400 Received: from debbugs.gnu.org ([208.118.235.43]:53872) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ewA98-00086k-CT for bug-guix@gnu.org; Wed, 14 Mar 2018 13:25:02 -0400 Sender: "Debbugs-submit" Resent-Message-ID: In-Reply-To: <87o9jq7j7r.fsf@gnu.org> ("Ludovic \=\?utf-8\?Q\?Court\=C3\=A8s\=22'\?\= \=\?utf-8\?Q\?s\?\= message of "Wed, 14 Mar 2018 16:47:04 +0100") List-Id: Bug reports for GNU Guix List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-guix-bounces+gcggb-bug-guix=m.gmane.org@gnu.org Sender: "bug-Guix" To: 30820@debbugs.gnu.org There are two issues. First the gcc-strmov-store-file-names.patch stopped working. When we introduced it, we were at 5.3.0 and 6.2.0 (see ). Today, with 5.5.0 and 6.3.0 it seems to have no effect (I use =E2=80=98ltra= ce=E2=80=99 here, which shows the getenv("NIX_STORE") call, which confirms that the =E2=80=98store_reference_p=E2=80=99 function in that patch gets called): --8<---------------cut here---------------start------------->8--- $ cat strmov.c #define _GNU_SOURCE #include static const char str[] =3D "MEMpCPY /gnu/store/THIS IS A LONG STRING, A VE= RY, VERY, VERY LOOOOONG STRING"; extern char *p, *q; #ifndef MEMCPY # define MEMCPY memcpy #endif void foo (char *x, char *y) { /* MEMCPY (x, str, sizeof str); */ MEMCPY (y, "this is a literal /gnu/store string", 35); } $ guix environment --no-grafts --pure --ad-hoc -C ltrace gcc-toolchain@5 --= ltrace -f -e getenv gcc -O2 -c strmov.c=20 [pid 2] gcc->getenv("COLUMNS") = =3D nil [pid 2] gcc->getenv("TERM") = =3D nil [pid 2] gcc->getenv("GCC_EXEC_PREFIX") = =3D nil [pid 2] gcc->getenv("PATH") = =3D "/gnu/store/c312mxd0ykdh3zi3zj13m".= .. [pid 2] gcc->getenv("PATH") = =3D "/gnu/store/c312mxd0ykdh3zi3zj13m".= .. [pid 2] gcc->getenv("COMPILER_PATH") = =3D nil [pid 2] gcc->getenv("LIBRARY_PATH") = =3D "/gnu/store/c312mxd0ykdh3zi3zj13m".= .. [pid 2] gcc->getenv("LPATH") = =3D nil [pid 2] gcc->getenv("GCC_COMPARE_DEBUG") = =3D nil [pid 2] gcc->getenv("GCC_ROOT") = =3D nil [pid 2] gcc->getenv("BINUTILS_ROOT") = =3D nil [pid 2] gcc->getenv("TMPDIR") = =3D "/tmp" [pid 2] gcc->getenv("TMP") = =3D "/tmp" [pid 2] gcc->getenv("TEMP") = =3D "/tmp" [pid 3] --- Called exec() --- [pid 3] gcc->getenv("COLUMNS") = =3D nil [pid 3] gcc->getenv("TERM") = =3D nil [pid 3] gcc->getenv("DEPENDENCIES_OUTPUT") = =3D nil [pid 3] gcc->getenv("SUNPRO_DEPENDENCIES") = =3D nil [pid 3] gcc->getenv("CPATH") = =3D nil [pid 3] gcc->getenv("C_INCLUDE_PATH") = =3D "/gnu/store/c312mxd0ykdh3zi3zj13m".= .. [pid 3] gcc->getenv("GCC_EXEC_PREFIX") = =3D nil [pid 3] gcc->getenv("PWD") = =3D nil [pid 3] gcc->getenv("NIX_STORE") = =3D nil [pid 3] +++ exited (status 0) +++ [pid 2] --- SIGCHLD (Child exited) --- [pid 4] --- Called exec() --- [pid 4] +++ exited (status 0) +++ [pid 2] --- SIGCHLD (Child exited) --- [pid 2] +++ exited (status 0) +++ $ objdump -S strmov.o | grep movabs 0: 48 b8 74 68 69 73 20 movabs $0x2073692073696874,%rax 11: 48 b8 61 20 6c 69 74 movabs $0x61726574696c2061,%rax 1f: 48 b8 6c 20 2f 67 6e movabs $0x732f756e672f206c,%rax 2d: 48 b8 74 6f 72 65 20 movabs $0x7274732065726f74,%rax $ guix environment --no-grafts --pure --ad-hoc -C ltrace gcc-toolchain@6 --= ltrace -f -e getenv gcc -O2 -c strmov.c=20 [pid 2] gcc->getenv("COLUMNS") = =3D nil [pid 2] gcc->getenv("TERM") = =3D nil [pid 2] gcc->getenv("GCC_EXEC_PREFIX") = =3D nil [pid 2] gcc->getenv("PATH") = =3D "/gnu/store/5141337yvhhjj5fhdx660".= .. [pid 2] gcc->getenv("PATH") = =3D "/gnu/store/5141337yvhhjj5fhdx660".= .. [pid 2] gcc->getenv("COMPILER_PATH") = =3D nil [pid 2] gcc->getenv("LIBRARY_PATH") = =3D "/gnu/store/5141337yvhhjj5fhdx660".= .. [pid 2] gcc->getenv("LPATH") = =3D nil [pid 2] gcc->getenv("GCC_COMPARE_DEBUG") = =3D nil [pid 2] gcc->getenv("GCC_ROOT") = =3D nil [pid 2] gcc->getenv("BINUTILS_ROOT") = =3D nil [pid 2] gcc->getenv("TMPDIR") = =3D "/tmp" [pid 2] gcc->getenv("TMP") = =3D "/tmp" [pid 2] gcc->getenv("TEMP") = =3D "/tmp" [pid 3] --- Called exec() --- [pid 3] gcc->getenv("COLUMNS") = =3D nil [pid 3] gcc->getenv("TERM") = =3D nil [pid 3] gcc->getenv("DEPENDENCIES_OUTPUT") = =3D nil [pid 3] gcc->getenv("SUNPRO_DEPENDENCIES") = =3D nil [pid 3] gcc->getenv("CPATH") = =3D nil [pid 3] gcc->getenv("C_INCLUDE_PATH") = =3D "/gnu/store/5141337yvhhjj5fhdx660".= .. [pid 3] gcc->getenv("GCC_EXEC_PREFIX") = =3D nil [pid 3] gcc->getenv("PWD") = =3D nil [pid 3] gcc->getenv("NIX_STORE") = =3D nil [pid 3] +++ exited (status 0) +++ [pid 2] --- SIGCHLD (Child exited) --- [pid 4] --- Called exec() --- [pid 4] +++ exited (status 0) +++ [pid 2] --- SIGCHLD (Child exited) --- [pid 2] +++ exited (status 0) +++ $ objdump -S strmov.o | grep movabs 0: 48 b8 74 68 69 73 20 movabs $0x2073692073696874,%rax 11: 48 b8 61 20 6c 69 74 movabs $0x61726574696c2061,%rax 1f: 48 b8 6c 20 2f 67 6e movabs $0x732f756e672f206c,%rax 2d: 48 b8 74 6f 72 65 20 movabs $0x7274732065726f74,%rax --8<---------------cut here---------------end--------------->8--- On GCC 7.3.0, it works as intended: --8<---------------cut here---------------start------------->8--- $ guix environment --no-grafts --pure --ad-hoc -C ltrace gcc-toolchain@7 --= ltrace -f -e getenv gcc -O2 -c strmov.c=20 [pid 2] gcc->getenv("COLUMNS") = =3D nil [pid 2] gcc->getenv("TERM") = =3D nil [pid 2] gcc->getenv("GCC_EXEC_PREFIX") = =3D nil [pid 2] gcc->getenv("PATH") = =3D "/gnu/store/zahi3qjfnfq5z0bsxkggq".= .. [pid 2] gcc->getenv("PATH") = =3D "/gnu/store/zahi3qjfnfq5z0bsxkggq".= .. [pid 2] gcc->getenv("COMPILER_PATH") = =3D nil [pid 2] gcc->getenv("LIBRARY_PATH") = =3D "/gnu/store/zahi3qjfnfq5z0bsxkggq".= .. [pid 2] gcc->getenv("LPATH") = =3D nil [pid 2] gcc->getenv("GCC_COMPARE_DEBUG") = =3D nil [pid 2] gcc->getenv("GCC_ROOT") = =3D nil [pid 2] gcc->getenv("BINUTILS_ROOT") = =3D nil [pid 2] gcc->getenv("TMPDIR") = =3D "/tmp" [pid 2] gcc->getenv("TMP") = =3D "/tmp" [pid 2] gcc->getenv("TEMP") = =3D "/tmp" [pid 3] --- Called exec() --- [pid 3] gcc->getenv("COLUMNS") = =3D nil [pid 3] gcc->getenv("TERM") = =3D nil [pid 3] gcc->getenv("DEPENDENCIES_OUTPUT") = =3D nil [pid 3] gcc->getenv("SUNPRO_DEPENDENCIES") = =3D nil [pid 3] gcc->getenv("CPATH") = =3D nil [pid 3] gcc->getenv("C_INCLUDE_PATH") = =3D "/gnu/store/zahi3qjfnfq5z0bsxkggq".= .. [pid 3] gcc->getenv("GCC_EXEC_PREFIX") = =3D nil [pid 3] gcc->getenv("PWD") = =3D nil [pid 3] gcc->getenv("NIX_STORE") = =3D nil [pid 3] +++ exited (status 0) +++ [pid 2] --- SIGCHLD (Child exited) --- [pid 4] --- Called exec() --- [pid 4] +++ exited (status 0) +++ [pid 2] --- SIGCHLD (Child exited) --- [pid 2] +++ exited (status 0) +++ $ objdump -S strmov.o | grep movabs $ guix environment --no-grafts --pure --ad-hoc -C ltrace gcc-toolchain@6 --= /bin/sh -c 'export NIX_STORE=3D/foo ; ltrace -f -e getenv gcc -O2 -c str= mov.c ' [pid 3] gcc->getenv("COLUMNS") = =3D nil [pid 3] gcc->getenv("TERM") = =3D nil [pid 3] gcc->getenv("GCC_EXEC_PREFIX") = =3D nil [pid 3] gcc->getenv("PATH") = =3D "/gnu/store/5141337yvhhjj5fhdx660".= .. [pid 3] gcc->getenv("PATH") = =3D "/gnu/store/5141337yvhhjj5fhdx660".= .. [pid 3] gcc->getenv("COMPILER_PATH") = =3D nil [pid 3] gcc->getenv("LIBRARY_PATH") = =3D "/gnu/store/5141337yvhhjj5fhdx660".= .. [pid 3] gcc->getenv("LPATH") = =3D nil [pid 3] gcc->getenv("GCC_COMPARE_DEBUG") = =3D nil [pid 3] gcc->getenv("GCC_ROOT") = =3D nil [pid 3] gcc->getenv("BINUTILS_ROOT") = =3D nil [pid 3] gcc->getenv("TMPDIR") = =3D "/tmp" [pid 3] gcc->getenv("TMP") = =3D "/tmp" [pid 3] gcc->getenv("TEMP") = =3D "/tmp" [pid 4] --- Called exec() --- [pid 4] gcc->getenv("COLUMNS") = =3D nil [pid 4] gcc->getenv("TERM") = =3D nil [pid 4] gcc->getenv("DEPENDENCIES_OUTPUT") = =3D nil [pid 4] gcc->getenv("SUNPRO_DEPENDENCIES") = =3D nil [pid 4] gcc->getenv("CPATH") = =3D nil [pid 4] gcc->getenv("C_INCLUDE_PATH") = =3D "/gnu/store/5141337yvhhjj5fhdx660".= .. [pid 4] gcc->getenv("GCC_EXEC_PREFIX") = =3D nil [pid 4] gcc->getenv("PWD") = =3D "/home/ludo/src/guix" [pid 4] gcc->getenv("NIX_STORE") = =3D "/foo" [pid 4] gcc->getenv("NIX_STORE") = =3D "/foo" [pid 4] +++ exited (status 0) +++ [pid 3] --- SIGCHLD (Child exited) --- [pid 5] --- Called exec() --- [pid 5] +++ exited (status 0) +++ [pid 3] --- SIGCHLD (Child exited) --- [pid 3] +++ exited (status 0) +++ $ objdump -S strmov.o | grep movabs 0: 48 b8 74 68 69 73 20 movabs $0x2073692073696874,%rax 11: 48 b8 61 20 6c 69 74 movabs $0x61726574696c2061,%rax 1f: 48 b8 6c 20 2f 67 6e movabs $0x732f756e672f206c,%rax 2d: 48 b8 74 6f 72 65 20 movabs $0x7274732065726f74,%rax --8<---------------cut here---------------end--------------->8--- The second issue is that the patch only ever worked with literal strings. It does not =E2=80=9Csee=E2=80=9D strings in constant arrays like= the =E2=80=98str=E2=80=99 array in the example above. The gconv-module file name mentioned in the first message in this bug report is an example of a string assigned to a static array, in iconv/gconv_conf.c: /* This is the default path where we look for module lists. */ static const char default_gconv_path[] =3D GCONV_PATH; Ludo=E2=80=99.