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

Mark Millard marklmi at yahoo.com
Sat Nov 17 02:26:14 UTC 2018


[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 = 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 
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= for buildworld the above would normally
not be found. But for WITH_BINUTILS= 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)		 = 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=-r-xr-xr-x ,inode=80287,size=21817416,blksize=32768 },0x0) = 0 (0x0)
__sysctl(0xbfbfe020,0x2,0xbfbfe018,0xbfbfe01c,0xe,0x236c9140) = 0 (0x0)
access("/usr/bin/clang",F_OK)			 = 0 (0x0)
vfork()						 = 61461 (0xf015)
wait4(61461,{ EXITED,val=0 },0x0,0x0)		 = 61461 (0xf015)
access("/usr/local/bin/as",F_OK)		 = 0 (0x0)
vfork()						 = 61462 (0xf016)
wait4(61462,{ EXITED,val=0 },0x0,0x0)		 = 61462 (0xf016)
access("/tmp/test_bx_lr-0c7bf8.s",W_OK)		 = 0 (0x0)
fstatat(AT_FDCWD,"/tmp/test_bx_lr-0c7bf8.s",{ mode=-rw-r--r-- ,inode=802647,size=210,blksize=32768 },0x0) = 0 (0x0)
fstatat(AT_FDCWD,"/tmp/test_bx_lr-0c7bf8.s",{ mode=-rw-r--r-- ,inode=802647,size=210,blksize=32768 },AT_SYMLINK_NOFOLLOW) = 0 (0x0)
fstatat(AT_FDCWD,"/tmp/test_bx_lr-0c7bf8.s",{ mode=-rw-r--r-- ,inode=802647,size=210,blksize=32768 },AT_SYMLINK_NOFOLLOW) = 0 (0x0)
unlink("/tmp/test_bx_lr-0c7bf8.s")		 = 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 = 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 
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.

===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)



More information about the freebsd-ports mailing list