Thanks for your answer.
I've been trying to link with gcc and I still cannot get it to work.
Here is my code for lldiv :
Code:
lldiv_t lldiv(long long numerator, long long denominator) {
lldiv_t result;
result.quotient = numerator / denominator;
result.remainder = numerator % denominator;
if(numerator >= 0 && result.remainder < 0) {
result.quotient++;
result.remainder -= denominator;
}
return result;
}
Once compiled, it looks like this :
Code:
.text:080001D0 public lldiv
.text:080001D0 lldiv proc near
.text:080001D0
.text:080001D0 var_2C = dword ptr -2Ch
.text:080001D0 var_28 = dword ptr -28h
.text:080001D0 var_24 = dword ptr -24h
.text:080001D0 var_20 = dword ptr -20h
.text:080001D0 arg_0 = dword ptr 4
.text:080001D0 arg_4 = dword ptr 8
.text:080001D0 arg_8 = dword ptr 0Ch
.text:080001D0 arg_C = dword ptr 10h
.text:080001D0 arg_10 = dword ptr 14h
.text:080001D0
.text:080001D0 push ebp
.text:080001D1 push edi
.text:080001D2 push esi
.text:080001D3 push ebx
.text:080001D4 sub esp, 1Ch
.text:080001D7 mov eax, [esp+2Ch+arg_C]
.text:080001DB mov edx, [esp+2Ch+arg_10]
.text:080001DF mov ebp, [esp+2Ch+arg_0]
.text:080001E3 mov esi, [esp+2Ch+arg_4]
.text:080001E7 mov edi, [esp+2Ch+arg_8]
.text:080001EB mov ecx, edx
.text:080001ED mov edx, eax
.text:080001EF lea eax, [esp+2Ch+var_24]
.text:080001F3 sub esp, 0Ch
.text:080001F6 push eax
.text:080001F7 mov [esp+3Ch+var_28], ecx
.text:080001FB mov [esp+3Ch+var_2C], edx
.text:080001FF push ecx
.text:08000200 push edx
.text:08000201 push edi
.text:08000202 push esi
.text:08000203 call __divmoddi4
.text:08000208 add esp, 20h
.text:0800020B mov ebx, edx
.text:0800020D mov ecx, eax
.text:0800020F mov edx, [esp+2Ch+var_20]
.text:08000213 mov eax, [esp+2Ch+var_24]
.text:08000217 test edx, edx
.text:08000219 jns short loc_800021F
.text:0800021B test edi, edi
.text:0800021D jns short loc_8000240
.text:0800021F
.text:0800021F loc_800021F: ; CODE XREF: lldiv+49↑j
.text:0800021F ; lldiv:loc_800024D↓j
.text:0800021F mov [ebp+8], eax
.text:08000222 mov [ebp+0], ecx
.text:08000225 mov eax, ebp
.text:08000227 mov [ebp+4], ebx
.text:0800022A mov [ebp+0Ch], edx
.text:0800022D add esp, 1Ch
.text:08000230 pop ebx
.text:08000231 pop esi
.text:08000232 pop edi
.text:08000233 pop ebp
.text:08000234 retn 4
.text:08000234 ; ---------------------------------------------------------------------------
.text:08000237 align 10h
.text:08000240
.text:08000240 loc_8000240: ; CODE XREF: lldiv+4D↑j
.text:08000240 add ecx, 1
.text:08000243 adc ebx, 0
.text:08000246 sub eax, [esp+2Ch+var_2C]
.text:08000249 sbb edx, [esp+2Ch+var_28]
.text:0800024D
.text:0800024D loc_800024D: ; DATA XREF: .eh_frame:080002A0↓o
.text:0800024D ; .eh_frame:080002F8↓o ...
.text:0800024D jmp short loc_800021F
.text:0800024D lldiv endp
Here is the console output :
Code:
i686-elf-gcc -nodefaultlibs -nostdlib -lgcc -static-libgcc -T kernel/link.ld kernel/i386/isr.o kernel/boot/multiboot.o kernel/video/kernel_video.o kernel/i386/irq.o kernel/i386/exception.o kernel/i386/idt.o kernel/i386/pic.o kernel/i386/gdt.o kernel/boot/kernel.o kernel/drivers/serial.o kernel/libc/stdlib.o kernel/libc/string.o -o kernel/kernel.elf
kernel/libc/stdlib.o: In function `lldiv':
stdlib.c:(.text+0x204): undefined reference to `__divmoddi4'
collect2: error: ld returned 1 exit status
I have found __divmoddi4 in gcc's source code in libgcc/libgcc2.c.
I also have found it in the compiled libgcc files with readelf, so I really cannot understand why it does not work.
Best regards,
Ankeraout.