[arch-general] Issue linking 32-bit GAS assembly

Dutch Ingraham stoa at gmx.us
Wed Oct 17 22:01:46 UTC 2018


On Wed, Oct 17, 2018 at 11:07:02PM +0200, Maarten de Vries via arch-general wrote:
> Why not let gcc take care of what compiler/assembler and linker to invoke
> with which precise flags:
> 
> $ gcc -m32 -o foo filename.s
> $ ./foo # great success!
> 
> It will probably link to libc without you even asking for it. And if that
> works and you really want to know what linker flags you need, you can add -v
> to make gcc spam you about it.
> 

GCC will handle some files, but not others.  In this case, I get
garbage output then a segfault/core dump.

Using -nostdlib and -static also fail to build, but I have had success
with just using <gcc -m32 -nostartfiles -o file file.s>

I would, however, like to know how to use as/ld on Arch, as it is my
main OS.



> 
> -- Maarten
> 
> (Sent off-list by accident before, sending to the list now.)
> 
> 
> On 10/17/18 9:36 PM, Dutch Ingraham wrote:
> > Hi all:
> > 
> > I'm having a problem linking 32-bit GAS assembly code that references external
> > C libraries on an up-to-date 64-bit Arch installation.
> > 
> > I have enabled the 32-bit repositories and installed the multilib-devel group
> > and lib32-glibc. I have updated the library cache with ldconfig and rebooted.
> > 
> > The command to assemble is: <as --32 -o filename.o filename.s>.  Assembly
> > succeeds.
> > 
> > However, when linking using the command
> > <ld -melf_i386 --dynamic-linker /lib32/ld-linux.so.2 -lc -o filename filename.o>
> > 
> > the command fails with:
> > 	ld: skipping incompatible /usr/lib/libc.so when searching for -lc
> > 	ld: skipping incompatible /usr/lib/libc.a when searching for -lc
> > 	ld: cannot find -lc
> > 
> > Note this linker command (or a hierarchy-appropriate one) seems standard, and
> > succeeds on a 64-bit Debian OS.
> > 
> > There is a fairly recent Forum question (but pre-dating the discontinuance of
> > i686 support) regarding the same issue at
> > https://bbs.archlinux.org/viewtopic.php?id=229235 which indicates the command
> > should be:
> > 
> > <ld -melf_i386 -shared -L /usr/lib32 -dynamic-linker /lib/ld-linux.so.2 -o \
> > filename filename.o -lc>
> > 
> > This command succeeds, insofar as the linker returns an exit code of 0. However,
> > running the program (and all other similar programs) fails with "Illegal
> > instruction (core dumped)." Assembling with debugging symbols and running a
> > backtrace didn't enlighten me.
> > 
> > Note that changing /lib/ld-linux to /usr/lib32/ld-linux in the command immediately
> > above produces the same result, as confirmed by the output of <ldconfig -p>
> > 
> > Anyone see something I've missed of have any suggestions?  Thanks.
> > 
> > 
> > -----------
> > 
> > Here is some simple code to test with:
> > 
> > 
> > # paramtest2.s - Listing system environment variables
> > .section .data
> > output:
> >     .asciz "%s\n"
> > .section .text
> > .globl _start
> > _start:
> >     movl %esp, %ebp
> >     addl $12, %ebp
> > loop1:
> >     cmpl $0, (%ebp)
> >     je endit
> >     pushl (%ebp)
> >     pushl $output
> >     call printf
> >     addl $12, %esp
> >     addl $4, %ebp
> >     loop loop1
> > endit:
> >     pushl $0
> >     call exit


More information about the arch-general mailing list