Date: Fri, 16 Nov 2018 18:15:50 -0800 From: Mark Millard <marklmi@yahoo.com> To: Jan Beich <jbeich@FreeBSD.org> Cc: ports-list freebsd <freebsd-ports@freebsd.org> Subject: Re: ports head -r487783: on armv7 x11/pixman fails to build: /usr/bin/ld: error: can't create dynamic relocation R_ARM_V4BX against local symbol in readonly segment; recompile object files with -fPIC Message-ID: <908FD96A-9F8F-4477-8E2F-2C97D49AF35E@yahoo.com> In-Reply-To: <03FFE5BB-777D-40D3-9AA3-C8C359BE1F2B@yahoo.com> References: <A76D7D49-E36E-4665-AA4B-D083CCF7D57B@yahoo.com> <a7m8-loy5-wny@FreeBSD.org> <03FFE5BB-777D-40D3-9AA3-C8C359BE1F2B@yahoo.com>
next in thread | previous in thread | raw e-mail | index | archive | help
[History omitted. This should stand on its own well.] I finally figured out parts of the issue, I think. At least how the V_ARM_V4BX use is getting there despite lld's status for handling it . . . On armv7: # more test_bx_lr.S .text .arch armv6 .object_arch armv4 .arm .altmacro .p2align 2 .func fname .global fname .hidden fname .type fname, %function fname: bx lr (I got those lines from the failing port's .S files, including includes. Note the .object_arch armv4 use and the forced armv6, not armv7.) # clang -target armv7-unknown-freebsd13.0-gnueabihf -O -pipe = -no-integrated-as -MT test_bx_lr.lo -MD -MP -MF test_bx_lr.Tpo -c = test_bx_lr.S -fPIC -DPIC -o test_bx_lr.o (The -target is not necessary. I just choose to be explicit.) # objdump -x test_bx_lr.o | more test_bx_lr.o: file format elf32-littlearm test_bx_lr.o architecture: armv4, flags 0x00000011: HAS_RELOC, HAS_SYMS start address 0x00000000 private flags =3D 5000000: [Version5 EABI] Sections: Idx Name Size VMA LMA File off Algn 0 .text 00000004 00000000 00000000 00000034 2**2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 1 .data 00000000 00000000 00000000 00000038 2**0 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 00000000 00000000 00000038 2**0 ALLOC 3 .ARM.attributes 0000001b 00000000 00000000 00000038 2**0 CONTENTS, READONLY SYMBOL TABLE: 00000000 l d .text 00000000 .text 00000000 l d .data 00000000 .data 00000000 l d .bss 00000000 .bss 00000000 l d .ARM.attributes 00000000 .ARM.attributes 00000000 g F .text 00000000 .hidden fname RELOCATION RECORDS FOR [.text]: OFFSET TYPE VALUE=20 00000000 R_ARM_V4BX *ABS* truss for that cc command reports looking in many places for as, finally finding /usr/local/bin/as : access("/usr/bin/armv7-unknown-freebsd13.0-gnueabihf-as",X_OK|R_OK) = ERR#2 'No such file or directory' access("/usr/bin/as",X_OK|R_OK) ERR#2 'No such file or = directory' (Note: based on WITHOUT_BINUTILS=3D for buildworld the above would = normally not be found. But for WITH_BINUTILS=3D the host as would be found.) access("/sbin/armv7-unknown-freebsd13.0-gnueabihf-as",X_OK|R_OK) ERR#2 = 'No such file or directory' access("/bin/armv7-unknown-freebsd13.0-gnueabihf-as",X_OK|R_OK) ERR#2 = 'No such file or directory' access("/usr/sbin/armv7-unknown-freebsd13.0-gnueabihf-as",X_OK|R_OK) = ERR#2 'No such file or directory' access("/usr/bin/armv7-unknown-freebsd13.0-gnueabihf-as",X_OK|R_OK) = ERR#2 'No such file or directory' = access("/usr/local/sbin/armv7-unknown-freebsd13.0-gnueabihf-as",X_OK|R_OK)= ERR#2 'No such file or directory' = access("/usr/local/bin/armv7-unknown-freebsd13.0-gnueabihf-as",X_OK|R_OK) = ERR#2 'No such file or directory' = access("/usr/home/markmi/bin/armv7-unknown-freebsd13.0-gnueabihf-as",X_OK|= R_OK) ERR#2 'No such file or directory' access("/sbin/as",X_OK|R_OK) ERR#2 'No such file or = directory' access("/bin/as",X_OK|R_OK) ERR#2 'No such file or = directory' access("/usr/sbin/as",X_OK|R_OK) ERR#2 'No such file or = directory' access("/usr/bin/as",X_OK|R_OK) ERR#2 'No such file or = directory' access("/usr/local/sbin/as",X_OK|R_OK) ERR#2 'No such file or = directory' access("/usr/local/bin/as",X_OK|R_OK) =3D 0 (0x0) (Note the /usr/home/markmi/bin/armv7-unknown-freebsd13.0-gnueabihf-as = attempt before the one actually found and used. I would not have guessed the need to worry about such a place.) Then follows: fstatat(AT_FDCWD,"/usr/local/bin/as",{ mode=3D-r-xr-xr-x = ,inode=3D80287,size=3D21817416,blksize=3D32768 },0x0) =3D 0 (0x0) __sysctl(0xbfbfe020,0x2,0xbfbfe018,0xbfbfe01c,0xe,0x236c9140) =3D 0 = (0x0) access("/usr/bin/clang",F_OK) =3D 0 (0x0) vfork() =3D 61461 (0xf015) wait4(61461,{ EXITED,val=3D0 },0x0,0x0) =3D 61461 (0xf015) access("/usr/local/bin/as",F_OK) =3D 0 (0x0) vfork() =3D 61462 (0xf016) wait4(61462,{ EXITED,val=3D0 },0x0,0x0) =3D 61462 (0xf016) access("/tmp/test_bx_lr-0c7bf8.s",W_OK) =3D 0 (0x0) fstatat(AT_FDCWD,"/tmp/test_bx_lr-0c7bf8.s",{ mode=3D-rw-r--r-- = ,inode=3D802647,size=3D210,blksize=3D32768 },0x0) =3D 0 (0x0) fstatat(AT_FDCWD,"/tmp/test_bx_lr-0c7bf8.s",{ mode=3D-rw-r--r-- = ,inode=3D802647,size=3D210,blksize=3D32768 },AT_SYMLINK_NOFOLLOW) =3D 0 = (0x0) fstatat(AT_FDCWD,"/tmp/test_bx_lr-0c7bf8.s",{ mode=3D-rw-r--r-- = ,inode=3D802647,size=3D210,blksize=3D32768 },AT_SYMLINK_NOFOLLOW) =3D 0 = (0x0) unlink("/tmp/test_bx_lr-0c7bf8.s") =3D 0 (0x0) llvm/clang is not providing the assembler used for -no-integrated-as . This would appear to imply that a system without ports or other such can not use -no-integrated-as with clang for buildworld buildkernel. In my normal armv7 command line context the above ends up using: # /usr/local/bin/as -v GNU assembler version 2.30 (armv7-portbld-freebsd13.0) using BFD version = (GNU Binutils) 2.30 So a GNU toolchain's as is actually in control of what goes in the .o file in many contexts. It is not clear that all the alternatives are equivalent for R_ARM_V4BX being generated or not. Simplifying the command (but still showing target): # clang -target armv7-unknown-freebsd13.0-gnueabihf -pipe = -no-integrated-as -c test_bx_lr.S -o test_bx_lr.o # objdump -x test_bx_lr.o | more test_bx_lr.o: file format elf32-littlearm test_bx_lr.o architecture: armv4, flags 0x00000011: HAS_RELOC, HAS_SYMS start address 0x00000000 private flags =3D 5000000: [Version5 EABI] Sections: Idx Name Size VMA LMA File off Algn 0 .text 00000004 00000000 00000000 00000034 2**2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 1 .data 00000000 00000000 00000000 00000038 2**0 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 00000000 00000000 00000038 2**0 ALLOC 3 .ARM.attributes 0000001b 00000000 00000000 00000038 2**0 CONTENTS, READONLY SYMBOL TABLE: 00000000 l d .text 00000000 .text 00000000 l d .data 00000000 .data 00000000 l d .bss 00000000 .bss 00000000 l d .ARM.attributes 00000000 .ARM.attributes 00000000 g F .text 00000000 .hidden fname RELOCATION RECORDS FOR [.text]: OFFSET TYPE VALUE=20 00000000 R_ARM_V4BX *ABS* Without the -no-integrated-as the notation in the file is rejected, with "unknown directive" for .func . Using poudriere bulk with -i and installing binutils in the session, I see the same inside my amd64->armv7 cross build environment. So there still is the question of how R_ARM_V4BX is handled by various lld's in various contexts. (Or whatever linker is being used if it is not lld.) Back to amd64 land . . . Renaming the existing as files so we can see all the places searched before not-found is declared (on amd64 with -target specified): access("/usr/bin/armv7-unknown-freebsd13.0-gnueabihf-as",X_OK|R_OK) = ERR#2 'No such file or directory' access("/usr/bin/as",X_OK|R_OK) ERR#2 'No such file or = directory' access("/usr/bin/x86_64-unknown-freebsd13.0-as",X_OK|R_OK) ERR#2 'No = such file or directory' access("/sbin/armv7-unknown-freebsd13.0-gnueabihf-as",X_OK|R_OK) ERR#2 = 'No such file or directory' access("/bin/armv7-unknown-freebsd13.0-gnueabihf-as",X_OK|R_OK) ERR#2 = 'No such file or directory' access("/usr/sbin/armv7-unknown-freebsd13.0-gnueabihf-as",X_OK|R_OK) = ERR#2 'No such file or directory' access("/usr/bin/armv7-unknown-freebsd13.0-gnueabihf-as",X_OK|R_OK) = ERR#2 'No such file or directory' = access("/usr/local/sbin/armv7-unknown-freebsd13.0-gnueabihf-as",X_OK|R_OK)= ERR#2 'No such file or directory' = access("/usr/local/bin/armv7-unknown-freebsd13.0-gnueabihf-as",X_OK|R_OK) = ERR#2 'No such file or directory' = access("/usr/home/markmi/bin/armv7-unknown-freebsd13.0-gnueabihf-as",X_OK|= R_OK) ERR#2 'No such file or directory' access("/sbin/as",X_OK|R_OK) ERR#2 'No such file or = directory' access("/bin/as",X_OK|R_OK) ERR#2 'No such file or = directory' access("/usr/sbin/as",X_OK|R_OK) ERR#2 'No such file or = directory' access("/usr/bin/as",X_OK|R_OK) ERR#2 'No such file or = directory' access("/usr/local/sbin/as",X_OK|R_OK) ERR#2 'No such file or = directory' access("/usr/local/bin/as",X_OK|R_OK) ERR#2 'No such file or = directory' access("/usr/home/markmi/bin/as",X_OK|R_OK) ERR#2 'No such file or = directory' access("/sbin/x86_64-unknown-freebsd13.0-as",X_OK|R_OK) ERR#2 'No such = file or directory' access("/bin/x86_64-unknown-freebsd13.0-as",X_OK|R_OK) ERR#2 'No such = file or directory' access("/usr/sbin/x86_64-unknown-freebsd13.0-as",X_OK|R_OK) ERR#2 'No = such file or directory' access("/usr/bin/x86_64-unknown-freebsd13.0-as",X_OK|R_OK) ERR#2 'No = such file or directory' access("/usr/local/sbin/x86_64-unknown-freebsd13.0-as",X_OK|R_OK) ERR#2 = 'No such file or directory' access("/usr/local/bin/x86_64-unknown-freebsd13.0-as",X_OK|R_OK) ERR#2 = 'No such file or directory' access("/usr/home/markmi/bin/x86_64-unknown-freebsd13.0-as",X_OK|R_OK) = ERR#2 'No such file or directory' (Note: It actually explicitly tries to use the x86_64 assembler if it does not find an armv7 or a generically pathed one. The generically pathed ones would normally also be x86_64 ones.) Another thing of note (using aarch64 as an example): /usr/local/aarch64-unknown-freebsd13.0/bin/as does not appear to be someplace that clang would find as but is a place devel/aarch64-binutils puts one. =3D=3D=3D Mark Millard marklmi at yahoo.com ( dsl-only.net went away in early 2018-Mar)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?908FD96A-9F8F-4477-8E2F-2C97D49AF35E>