I want to call a print function from my C program.
assembler prog:
#test.s .text .global _start .global print .type print, @function _start: call print # and exit. movl $0,%ebx # first argument: exit code. movl $1,%eax # system call number (sys_exit). int $0x80 # call kernel. print: # write our string to stdout. movl $len,%edx # third argument: message length. movl $msg,%ecx # second argument: pointer to message to write. movl $1,%ebx # first argument: file handle (stdout). movl $4,%eax # system call number (sys_write). int $0x80 # call kernel. mov $0, %eax ret .data msg: .ascii "Hello, world!\n" # the string to print. len = . - msg # length of the string. I can assemble and link it using:
$as test.s -o test.o $ld test.o -o test And I can execute it as a program, and it outputs "Hello, world!" But when I tried to call a print from C code like this:
#include <stdio.h> extern int print(); int main(){ int g; g = print(); printf("Hello from c!, %d\n", g); } It was compiled using:
$gcc -c main.c test It just prints "Hello from c, 13", that means that the function was called and return a number of chars, but does not print anything!
What am I doing wrong?
P.S. When I trying to compile prog like this:
$as test.s -o test.o $gcc -c main.c -o main.o $gcc main.c test.o I have a error:
/usr/bin/ld: test.o: in function `_start': (.text+0x0): multiple definition of `_start'; /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/Scrt1.o:(.text+0x0): first defined here /usr/bin/ld: test.o: relocation R_X86_64_32 against `.data' can not be used when making a PIE object; recompile with -fPIE /usr/bin/ld: final link failed: nonrepresentable section on output collect2: error: ld returned 1 exit status
gcc -no-pie -c test.s -o test.oandgcc -no-pie -o main main.c test.oseems to do the trick ...gcc -m32 main.c test.s -o main. You can optionally use-fno-pie -no-piebecause that's a good idea for 32-bit for efficiency.