LinuxQuestions.org
Help answer threads with 0 replies.
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices

Reply
 
Search this Thread
Old 10-26-2004, 05:39 PM   #1
Paul6253
LQ Newbie
 
Registered: Sep 2003
Posts: 7

Rep: Reputation: 0
problems with linking objects -- must know some nasm\ASM\linker


Hello

I present 2 problem cases ,each case is followed with tested code
thankyou for any help

--paul--
.................................................................................................... ...........................
CASE 1--

case 1 will compile but segfault when I insert into kernel using insmod

paul@box:~$ nasm -f elf foo.asm -o a.o
paul@box:~$ gcc -c foo.c -o b.o
paul@box:~$ ld -r a.o b.o -o kernelmod.o
paul@box:~$ sudo insmod -f kernelmod.o
Password:
Warning: kernel-module version mismatch
kernelmod.o was compiled for kernel version 2.4.20
while this kernel is version 2.4.20-xfs
Warning: loading kernelmod.o will taint the kernel: no license
See [xxx] for information about tainted modules
Warning: loading kernelmod.o will taint the kernel: forced load
Segmentation fault

gee, other than version mismatch I dont get why this code fails,
it should play some cool tones on my pc speaker

Code:
 

---------------------code for case1---------------

====== c code which calls asm module =========

#define MODULE
#define __KERNEL__
#include   <linux/module.h>
#include   <linux/kernel.h>









int init_module(void)
{

jump();

}
  void cleanup_module(void)
{




}

========== asm module ===========

 BITS 32

	  GLOBAL jump




	  SECTION .text

jump:

jmp Play







	  		;status in dx ,1= on 0 = off
ChangeSpeaker:
in al,0x61
cmp dx,1
jne off
or al,3
jmp on

off:
mov dx,3
not dx
and ax,dx
on:
out 0x61,al
RET
;end ChangeSpeaker



Sound:

;hertz in di
mov  dx,1                        ;turn on speaker
call ChangeSpeaker

mov al,0xb6
out 0x43, al

                                 ;  calculate tone
        mov    dx,14h
        mov    ax,4F38h          ;  divisor of frequency
        div    di
	                         ;  play tone
        out    42h,al            ;  lower byte of frequency
        mov    al,ah             ;
        out    42h,al            ;  higher byte of frequency

RET
;end sound


Delay:
        mov cx, 0xffff
        delay3:
        mov bx, 0xfff
        delay4:
        dec bx
        jnz delay4
        dec cx
        jnz delay3
RET
;end Delay




Play:

        pusha                    ;save regs
        lea si, [TONE_TABLE]     ;load sound data
GET_NEXT:
        mov di,[si]              ;grab a tone
	call Sound               ;play it
	call Delay



        add si,2
	cmp word [si],0
	jne GET_NEXT

	mov  dx,0                        ;turn off speaker
        call ChangeSpeaker





        ;restore regs and return
        popa
RET
;end Play



	  SECTION .data

TONE_TABLE    dw 16,32,65,130,261,523,1046,0


CASE 2--
these 2 modules will not compile, they follow the same 'call external asm routine'
format except this should be compiled to ELF EXECUTABLE format ,ie it's NOT
a loadable module

paul@box:~$ nasm -f elf test.asm
paul@box:~$ gcc -O3 test.c test.o -o TEST
In file included from /usr/include/linux/sched.h:14,
from /usr/include/linux/mm.h:4,
from test.c:1:
/usr/include/linux/timex.h:173: field `time' has incomplete type
In file included from /usr/include/asm/smp.h:15,
from /usr/include/linux/smp.h:14,
from /usr/include/linux/sched.h:23,
from /usr/include/linux/mm.h:4,
from test.c:1:
/usr/include/asm/fixmap.h:80: parse error before "pgprot_t"
In file included from /usr/include/asm/smp.h:21,
from /usr/include/linux/smp.h:14,
from /usr/include/linux/sched.h:23,
from /usr/include/linux/mm.h:4,
from test.c:1:
/usr/include/asm/apic.h:85: parse error before "unsigned"
In file included from /usr/include/linux/sched.h:23,
from /usr/include/linux/mm.h:4,
from test.c:1:
/usr/include/linux/smp.h:29: parse error before '(' token

as you can see ,problems with headers.
I need __get_free_pages() ,which is defined in linux/mm.h
Are there really typos in these headers or is it the oder in
which they are included???
I have found that sometimes order matters if header.h is dependant on variables declared in another header, the latter must precede the former


[CODE

--------------------- code case 2---------------------------------


===== c module ============

#include <linux/mm.h>








int * kep;



void y()
{


// ring0 code to jmp to
asm volatile ("mov $0x666,%di; in $0x61,%al" );
asm volatile ("or $3,%al;out %al,$0x61" );
asm volatile ("mov $0xb6,%al;out %al,$0x43");
asm volatile ("mov $0x14,%dx; mov $0x4F38,%ax");
asm volatile ("div %di; out %al,$0x42");
asm volatile ("mov %ah,%al; out %al,$0x42 ");
}


main()
{
kep = __get_free_pages(0x40, 3);
JUMP();


}


================== asm module ====================

; test source file for assembling to ELF
; build with:
; nasm -f elf elftest.asm
; gcc -o elftest elftest.c elftest.o
; (assuming your gcc is ELF)

; This file should test the following:

BITS 32

GLOBAL JUMP
EXTERN kep
EXTERN y


SECTION .text



JUMP:
mov dword esi,[kep]
lea edi,[y]
mov byte [esi],0xea
mov dword [esi+1],edi
jmp dword [kep]










SECTION .data




[/CODE]
 
Old 10-26-2004, 09:33 PM   #2
320mb
Senior Member
 
Registered: Nov 2002
Location: pikes peak
Distribution: Slackware, LFS
Posts: 2,577

Rep: Reputation: 47
Well hmm.........for case code #1 -- I tried this.......
Code:
Chessmaster ~/tiny elf/tiny $ nasm -f elf sound.asm
Chessmaster ~/tiny elf/tiny $ gcc -Wall -s -nostartfiles sound.o
Chessmaster ~/tiny elf/tiny $ ./a.out ; echo $7
Segmentation fault
it compiled and linked just fine and gave me an executable called a.out-- and they it seg faulted as you can see .........I did this without using your C code...........
and when I tried it just exactly as you did........I got the same error.......except I have the 2.4.27 kernel...........BUT the compiled version was for 2.4.22...........

your code looks good, but something in the kernel headers and the version of Glibc for which they were compiled against must be affecting the output.......
 
  


Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
asm compile problems ticky87 Red Hat 2 10-09-2005 01:15 AM
NASM linker rblampain Programming 2 06-29-2005 06:56 AM
Linker problems daveyboy685 Programming 3 03-31-2005 06:08 PM
any links on linking, loading shared libraries, shared objects. etc? ananthbv Programming 0 02-03-2005 08:47 AM
Linker problems on Mandrake 9.1 stodge Programming 0 05-07-2003 12:58 PM


All times are GMT -5. The time now is 05:38 AM.

Main Menu
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
identi.ca: @linuxquestions
Facebook: linuxquestions Google+: linuxquestions
Open Source Consulting | Domain Registration