Date: Thu, 12 Feb 2004 12:46:10 -0800 (PST) From: Adam Bozanich <abozan01@ccsf.edu> To: freebsd-questions@freebsd.org Subject: nasm, ld, libc, and **environ Message-ID: <Pine.HPX.4.44.0402121239450.5390-100000@hills.ccsf.cc.ca.us>
next in thread | raw e-mail | index | archive | help
Hi all. I am trying to learn asm with NASM on a FreeBSD system. I really need to debug my programs while I learn, so I want to use printf. This is what I am using to assemble and link: nasm -f elf use_printf.asm ld -o use_printf use_printf.asm -lc but then when I run the program: $./use_printf /usr/libexec/ld-elf.so.1: /lib/libc.so.5: Undefined symbol "environ" If I try to use static linking, I get this: $ld -static -o use_printf use_printf.asm -lc /usr/lib/libc.a(getenv.o): In function `getenv': getenv.o(.text+0x19): undefined reference to `environ' getenv.o(.text+0x29): undefined reference to `environ' getenv.o(.text+0x63): undefined reference to `environ' /usr/lib/libc.a(getenv.o): In function `__findenv': getenv.o(.text+0xd5): undefined reference to `environ' getenv.o(.text+0xe2): undefined reference to `environ' /usr/lib/libc.a(getenv.o)(.text+0x113): more undefined references to `environ' follow /usr/lib/libc.a(getprogname.o): In function `_getprogname': getprogname.o(.text+0x4): undefined reference to `__progname' Can somebody see where I am going wrong? This is kindof holding me back. I added the 'extern environ' and 'extern __progname' beause I get this otherwise: (when NOT using -static) /usr/lib/libc.so: undefined reference to `environ' /usr/lib/libc.so: undefined reference to `__progname' Here's what I have: ;;;;;;;;;;;;;;;;;;;;;; BEGIN CODE ;;;;;;;;;;;;;;;;;;;;;;;;;;;; extern printf extern environ extern __progname section .data mesg db 'the number is %d\n',0 mesglen equ $-mesg errormesg db 'libc error',0ah,0 errormesglen equ $-errormesg newline db 10 number dw 0x10 kernel: int 80h ret align 4 section .text global _start _start: ; call printf from libc push dword number push dword mesg call printf ; error if eax < 1 ( we should have wrote some chars ) cmp eax , 0x1 jl .error ; use write() system call to print message push dword mesglen push dword mesg push dword 0x1 ; stdout mov eax , 0x4 ; 4 == write system call call kernel ; output a newline push dword 1 push dword newline push dword 0x1 mov eax , 0x4 call kernel mov eax , 0x1 ; exit syscall number push dword 0x0 ; exit status call kernel .error: push dword errormesglen push dword errormesg push dword 0x1 mov eax , 0x4 call kernel mov eax , 0x1 push dword 0xff call kernel ;;;;;;;;;;;;;;;; END CODE ;;;;;;;;;;;;;;;;;;;;;;;;;;; Any suggestions will be greatly appreciated. Thanks -Adam
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.HPX.4.44.0402121239450.5390-100000>