2013年12月13日星期五

shared library 筆記

source: http://www.thegeekstuff.com/2012/06/linux-shared-libraries/

無聊來練一下shared library好了。

1.先寫好share.c
#include "shared.h"
unsigned int add(unsigned int a, unsigned int b)
{
    printf("\n Inside add()\n");
    return (a+b);
}
2.share.h
#include
extern unsigned int add(unsigned int a, unsigned int b);
3.編釋囉
gcc -c -Wall -Werror -fPIC share.c
gcc -shared -o libshare.so share.o

4.產生出來libshare.so囉!!!
# ls
libshare.so  share.c  share.h  share.o
5.寫一個測式的程式
include
#include"share.h"
int main(void)
{
    unsigned int a = 1;
    unsigned int b = 2;
    unsigned int result = 0;

    result = add(a,b);

    printf("\n The result is [%u]\n",result);
    return 0;
}

# gcc -L. -Wall sharetest.c -o go -lshare
-L. 在當前的目錄下,找-lshare 名稱為libshare.so的library來編。
# go
./go: error while loading shared libraries: libshare.so: cannot open shared object file: No such file or directory
go的測試程式找不到需要的libshare.so。

這時有兩個方法可以解決
 a.修改/etc/ld.so.conf 然後執行ldconfig
 vim /etc/ld.so.conf

include ld.so.conf.d/*.conf
/usr/local/openssl/lib/
/usr/lib
/home/carlosnew/Cpratic

b.export LD_LIBRARY_PATH=/home/carlosnew/Cpratic:$LD_LIBRARY_PATH

6最後一看一下執行結果!
# go

 Inside add()


 The result is [3]

 static library會佔用較多的記憶體因為把要用到的functions都先包進去了,但是執行速度會比較快,shared library執行速會比較慢,相同的function只需要一塊記憶體空間。

2013年12月12日星期四

Linux library筆記

這文章是static library的筆記,首先我們先寫兩個簡單的function當library要用的。
#include <stdio.h>

void bill(char arg)
{
  printf("Bill say:%s \n",arg);
}
#include <stdio.h>

void lucy(int arg)
{
  printf("lucy say+1:%d\n",(arg+1));
}

因為沒有main function是不能編成執行檔的。
 $ gcc lucy.c /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crt1.o: In function `_start': (.text+0x18): undefined reference to `main' collect2: ld returned 1 exit status
 所以要加這個參數 -c Compile and assemble, but do not link
 $ gcc -c bill.c lucy.c
 $ ls
 bill.c bill.o lucy.c lucy.o
#include <stdio.h>
#include <stdlib.h>
#include "mylib.h"

int main()
{
  lucy(11);
  exit(0);
}
編釋寫好的測式程式。
 $ gcc -o go carlos.c bill.o lucy.o
 $ ./go lucy say+1:12
這樣一來calros.c 就可以連接到lucy.o的function.

接下來我們來試著產生static的library *.a檔。
我把lib名稱取叫ks
 $ ar crv libks.a bill.o lucy.o a - bill.o a - lucy.o
 $ ls bill.c bill.o carlos.c go libks.a lucy.c lucy.o mylib.h
  $ gcc -o go carlos.c -L. -lks
-L是指定libraray的位置。 .的意思是在目前的目錄下找lib,-lks是要找名稱為libks的函式庫。 也可以使用ranlib放到標準目錄下

 $ ./go lucy say+1:12 

可以使用nm這指令來看object file有含哪些function.
$ nm libks.a

bill.o:
00000000 T bill
         U printf
lucy.o:
00000000 T lucy
         U printf
使用nm去看carlos.c的話只會看到含lucy的function,因為linker只會加入,真正有用到的function。

使用ldd來查看程式需要哪些share library最後面的數字是版本號。
$ ldd go
        linux-gate.so.1 =>  (0x00821000)
        libc.so.6 => /lib/i686/nosegneg/libc.so.6 (0x00439000)
        /lib/ld-linux.so.2 (0x0041a000)
static library的缺點是,每個程式在都使用同一個function時,發生相同的function程式碼,佔用記憶體的問題,使用shared library,程式會在被執行(載入記憶體時),才去連接載入相關function.

如何產生shared library可以參考下面的網頁
http://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
實務上我們會用Makefile來完成這些動作,這篇是基礎的教學。

reference: http://www.wrox.com/WileyCDA/WroxTitle/productCd-0470147628.html

2013年11月6日星期三

Opensource SMTP client with TLS/SSL for Gmail SMTP server. (How to cross-compilation)

     需求:想要能利用Gmail的SMTP server來發信,所以一定要有支援TLS/SSL功能
順便筆記一下
a.我選了這個opensource的STMP Client。Thanks gosu~
http://cleancode.org/projects/email

b.
先試試./configure --build=i686-pc-linux-gnu --host=ppc CC=powerpc-linux-gcc,可惜出現error。
直接./configure,再來改Makefile.

c.查一下有哪些Makefile
[root@new-host-1052 email-3.1.3]# find . -name "Makefile"
./dlib/Makefile
./src/Makefile
./Makefile
把三個Makefile裡面的CC = powerpc-linux-gcc

d.執行./configure時checking for SSL_library_init in -lssl... no

vim configure的script。 改check condiction
if test $ac_cv_lib_ssl_SSL_library_init = yes; then --> if test $ac_cv_lib_ssl_SSL_library_init = no; then
  cat >>confdefs.h <<_aceof p="">#define HAVE_LIBSSL 1
或是
vim ./include/config.h
硬改成1
/* Define to 1 if you have the `ssl' library (-lssl). */
#define HAVE_LIBSSL 1

e.遇到email-3.1.3/src/progress_bar.c:137: undefined reference to `rpl_malloc'

google說直接comment out這兩行就行了。
/* Define to rpl_malloc if the replacement function should be used. */
//#define malloc rpl_malloc
/* Define to rpl_realloc if the replacement function should be used. */
//#define realloc rpl_realloc

f.編成功後在email-3.1.3/src可以看到email這隻application。
[root@new-host-1052 src]# file email
email: ELF 32-bit MSB executable, PowerPC, version 1 (SYSV), dynamically linked (uses shared libs), not stripped

確認機器上有openssl的library
g.ls /usr/lib/
libcrypto.so            libssl.so
libcrypto.so.0.9.8      libssl.so.0.9.8

h. tftp 放到機器上。
[root@localhost /sbin]# tftp -gr email 192.168.4.215
email                100% |*******************************|   211k --:--:-- ETA

I.
 email -f"IloveTW@gmail.com" -n"IseeYOU" -s"SONYYO" 
-r"smtp.gmail.com" -mlogin -u"karose.tzu@gmail.com" -i"ycm2uru9" -tls -V "carlos
hsu@embeddedlinux.com.tw" < test.msg 
Connecting to server smtp.gmail.com on port 25

成功的收到信件.........收工!!!!!

2013年4月17日星期三

C function pointer 指標函數

相當方便的指標函數,可以輕鬆的乎叫對應的function。 (C function pointer with array can make functions call easier.)
#include <stdio .h>
#include<stdlib .h>

typedef int (*MYFUNC)();


int func1()
{
 printf("\n%s\n",__func__);
}

int func2()
{
 printf("\n%s\n",__func__);
}

int func3()
{
 printf("\n%s\n",__func__);
}

static MYFUNC funcs[3] = { &func1, &func2, &func3};


int main(int argc, char *argv[])
{

   (*(funcs[atoi(argv[1])]))();
}




執行結果(result):
[root@new-host-832 stanley]# ./a.out 0

func1
[root@new-host-832 stanley]# ./a.out 1

func2
[root@new-host-832 stanley]# ./a.out 2

func3
上面的範例,要剛好argv是照0~2,若argv是分開的話,可以用下面的做法。
#include <stdio .h>
#include<stdlib .h>

#define ARRAY_LEN(x) (sizeof(x)/sizeof((x)[0]))   //sizeof(x)是array x的總長, sizeof(x[0])是求x[0]用掉的空間..相除便是用array的size
#define FUNC_NUM ARRAY_LEN(CmdTable)

typedef void (*MYFUNC)();

typedef struct{
char *CmdName;
MYFUNC Cmdfunc;
}CMD;

void func1()
{
 printf("\n%s\n",__func__);
}

void func2()
{
 printf("\n%s\n",__func__);
}

void func3()
{
 printf("\n%s\n",__func__);
}

CMD CmdTable[]={
{"39",func1},
{"66",func2},
{"99",func3}
};

int main(int argc, char *argv[])
{
   int i=0;
     
     
    for(i=0; i< FUNC_NUM ;i++){
        if( !strcmp(argv[1],CmdTable[i].CmdName) )
                     (*(CmdTable[i].Cmdfunc))();
    }
}

執行結果如下: iwpriv, iwlist 很多open source的程式會用到這個方法。
[root@new-host-832 stanley]# ./a.out 39

func1
[root@new-host-832 stanley]# ./a.out 66

func2
[root@new-host-832 stanley]# ./a.out 99

func3

2013年4月16日星期二

C語言 enum

這在篇blog中,我將介紹一些enum的用法。
(I will show some enum type examples in C.)

enum的基本語法 enum identifier { enumerator-list } 

1. enum裡的識別字,會以int的型態,從0開始排列,你也可以給于數值。

 2. enum也可以不宣告identifier , 如第二個enum的宣告方法, 可以減少define的使用,enumerator可以是相同的值,如範例中off跟yes都是1。
 (Different constants in an enumeration may have the same value, identifier is not necessary)


#include <stdio.h>

typedef enum {sun, mon, tue, wed, thu, fri, sat}week_type;
enum{on=0, off=1, no=0, yes=1};
main()
{
   week_type day;

   day=thu;

   printf("\nDay=%d\n",day);
   printf("%d %d %d %d\n", on, off, no, yes);
}

執結果(result):


Day=4
0 1 0 1

2013年3月20日星期三

how to create a new fedora18 for develop embedded linux

1. Enable SSHd on Fedora18
  service sshd start
   chkconfig sshd on
   reboot

ref: http://fedora18tutorial.blogspot.tw/2012/11/how-to-start-ssh-service-on-fedora-18.html

2. install samba
  yum install cups-libs samba samba-common samba-client
  yum install  system-config-samba

  vim /etc/samba/smb.conf  add below:

[home]
        path = /home
        read only = no
;       browseable = yes
        guest ok = yes

  do not forget add users.
 smbpasswd –a xxxxxx

  ref: http://www.howtoforge.com/fedora-18-samba-standalone-server-with-tdbsam-backend


3./etc/selinux/config      
 SELINUX=disabled

4. chkconfig iptables off

2012年11月21日星期三

vmware 新增硬碟


[root@new-host-832 home]# fdisk -l

Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        2544    20434648+  83  Linux
/dev/sda2            2545        2610      530145   82  Linux swap / Solaris

Disk /dev/sdb: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        2610    20964793+  83  Linux

Disk /dev/sdc: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

[root@new-host-832 home]# fdisk /dev/sdc (select n -> p -> 1 -> enter -> enter -> w)


[root@new-host-832 home]# mkfs.ext3 /dev/sdc1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
5242880 inodes, 10484412 blocks
524220 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
320 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624

Writing inode tables: done                          
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 38 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.


[root@new-host-832 home]# mount /dev/sdc1 /home/carlosnew/
[root@new-host-832 home]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              19G  7.3G   11G  41% /
tmpfs                 379M     0  379M   0% /dev/shm
/dev/sdb1              20G   18G  1.6G  92% /home/DDRcodtelN
/dev/sdc1              40G  177M   38G   1% /home/carlosnew

vim /etc/rc.d/rc.local  add below line:
mount -t ext3 /dev/sdc1 /home/carlosnew/