gcc

Ŀ ¼

  1. gcc
    1. makefileд·¨
    2. gcc_egcsʹÓÃ
    3. gdbʹÓÃ
    4. gcc³£ÓÃÑ¡Ïî¶Ô´úÂëµÄÓ°Ïì
      1. Ò»°ãÇé¿ö
      2. -O ±àÒëÑ¡Ïî
      3. -O2 ±àÒëÑ¡Ïî
      4. -fomit-frame-pointer ±àÒëÑ¡Ïî
      5. -fomit-frame-pointer && -O2
      6. -fPIC ±àÒëÑ¡Ïî
      7. -static ±àÒëÑ¡Ïî
    5. AT&TµÄ»ã±à¸ñʽ
    6. x86ÄÚÁª»ã±à
      1. ¼òÊö
      2. ÄÚÁª»ã±à
      3. ³ÌÐòÄ£°å
      4. ²Ù×÷Êý
      5. ÐÞÊμĴæÆ÷Áбí
      6. ²Ù×÷ÊýÔ¼Êø
      7. ʾÀý
        1. ¼Ä´æÆ÷Ô¼Êø
        2. Æ¥ÅäÔ¼Êø
        3. ÄÚ´æ²Ù×÷ÊýÔ¼Êø
        4. ÐÞÊμĴæÆ÷
    7. ²»Í¬µÄCPUÏÂ×î¼Ñ±àÒë²ÎÊý
    8. ´úÂëά»¤
      1. ¼òµ¥cvs
      2. automake
      3. diff
      4. rcs
      5. ÄÚºËÖØ±àÒë³£¼û¹ÊÕÏ
      6. cvs
      7. ¹²Ïí¿â¹¤¾ß
      8. ´úÂëÓÅ»¯
      9. GNU ±àÂë±ê×¼
      10. Êé¼®


gcc

[Ŀ¼]


makefileд·¨

À¶É­ÁÖ http://www.lslnet.com 2001Äê3ÔÂ22ÈÕ 08:44

×÷ Õߣº ÐíÃ÷Ñå

Abstract:

    ÔÚ Unix ÉÏд³ÌʽµÄÈË´ó¸Å¶¼Åö¹ý Makefile£¬ÓÈÆäÊÇÓà C À´¿ª·¢³ÌʽµÄÈË¡£Óà makeÀ´¿ª·¢ºÍ±àÒë³ÌʽµÄÈ·ºÜ·½±ã£¬¿ÉÊÇҪд³öÒ»¸ö Makefile¾Í²»¼òµ¥ÁË¡£Æ«Æ«½éÉÜ Makefile µÄÎļþ²»¶à£¬GNU Make ÄÇ·ÝÓ¡³öÀ´Òª¼¸°ÙÒ³µÄÎļþ£¬¹â¿´Íê Overview ¾Í¿ìÕóÍöÁË£¬ÄѹÖÐí¶à
ÈËÎÅ Unix É«±ä¡£

    ±¾ÎĽ«½éÉÜÈçºÎÀûÓà GNU Autoconf ¼° Automake ÕâÁ½Ì×ÈíÌåÀ´Ð­ÖúÎÒÃÇ¡º×Ô¶¯¡»²úÉú Makefile µµ£¬²¢ÇÒÈÿª·¢³öÀ´µÄÈíÌå¿ÉÒÔÏñ Apache, MySQL ºÍ³£¼ûµÄ GNU ÈíÌåÒ»Ñù£¬Ö»Òª»á ``./configure'', ``make'', ``make install'' ¾Í¿ÉÒ԰ѳÌʽ°²×°µ½ÏµÍ³ÖС£Èç¹ûÄúÓÐ
ÐÄ¿ª·¢ Open Source µÄÈíÌ壬»òÖ»ÊÇÏëÔÚ Unix ϵͳÏÂдд³Ìʽ¡£Ï£ÍûÕâ·Ý½éÉÜÎļþÄܰïÖúÄúÇáËɵؽøÈë Unix Programming µÄµîÌá£

1. ¼ò½é

    Makefile »ù±¾ÉϾÍÊÇ¡ºÄ¿±ê¡»(target), ¡º¹ØÁ¬¡»(dependencies) ºÍ¡º¶¯×÷¡»ÈýÕßËù×é³ÉµÄÒ»Á¬´®¹æÔò¡£¶ø make ¾Í»á¸ù¾Ý Makefile µÄ¹æÔòÀ´¾ö¶¨ÈçºÎ±àÒë (compile) ºÍÁ¬½á (link) ³Ìʽ¡£Êµ¼ÊÉÏ£¬make ¿É×öµÄ²»Ö»ÊDZàÒëºÍÁ¬½á³Ìʽ£¬ÀýÈç FreeBSD µÄ port collect
ion ÖУ¬ Makefile »¹¿ÉÒÔ×öµ½×Ô¶¯ÏÂÔØÔ­Ê¼³ÌʽÌ×¼þ£¬½âѹËõ (extract) £¬ÐÞ²¹ (patch)£¬É趨£¬È»áá±àÒ룬°²×°ÖÁϵͳÖС£

    Makefile »ù±¾¹¹ÔìËäÈ»¼òµ¥£¬µ«ÊÇÍ×ÉÆÔËÓÃÕâЩ¹æÔò¾ÍÒ²¿ÉÒÔ±ä³öÐí¶à²»Í¬µÄ»¨ÕС£È´Ò²Òò´Ë£¬Ðí¶à¸Õ¿ªÊ¼Ñ§Ï°Ð´ Makefile ʱ»á¸Ðµ½Ã»Óй淶¿ÉÑ­£¬Ã¿¸öÈËд³öÀ´µÄ Makefile ³¤µÃ¶¼²»Ì«Ò»Ñù£¬²»ÖªµÀ´ÓºÎÏÂÊÖ£¬¶øÇÒ³£³£»áÊÜÏÞì¶×Ô¼ºµÄ¿ª·¢»·¾³£¬Ö»Òª»·¾³±äÊý²»Í¬»ò·
¾¶¸Äһϣ¬¿ÉÄÜMakefile ¾ÍµÃ¸ú×ÅÐ޸ġ£ËäÈ»ÓÐ GNU Makefile Conventions (GNU Makefile ¹ßÀý) ¶©³öһЩʹÓà GNU ³ÌʽÉè¼ÆÊ±×«Ð´ Makefile µÄһЩ±ê×¼ºÍ¹æ·¶£¬µ«ÊÇÄÚÈݺܳ¤¶øÇҺܸ´ÔÓ, ²¢ÇÒ¾­³£×öЩµ÷Õû£¬ÎªÁ˼õÇá³ÌʽÉè¼ÆÊ¦Î¬»¤ Makefile µÄ¸ºµ££¬Òò´ËÓÐÁËAutomake¡£

    ³ÌʽÉè¼ÆÊ¦Ö»ÐèдһЩԤÏȶ¨ÒåºÃµÄ¾Þ¼¯ (macro)£¬½»¸ø Automake ´¦Àíáá»á²úÉúÒ»¸ö¿É¹©Autoconf ʹÓÃµÄ Makefile.in µµ¡£ÔÙÅäºÏÀûÓÃAutoconf ²úÉúµÄ×Ô¶¯É趨µµ configure¼´¿É²úÉúÒ»·Ý·ûºÏ GNU Makefile¹ßÀýµÄ Makeifle ÁË¡£

2. ÉÏ·֮ǰ

    ÔÚ¿ªÊ¼ÊÔ×ÅÓà Automake ֮ǰ£¬ÇëÏÈÈ·ÈÏÄãµÄϵͳÒѾ­°²×°ÒÔϵÄÈíÌ壺
1. GNU Automake
2. GNU Autoconf
3. GNU m4
4. perl
5. GNU Libtool (Èç¹ûÄãÐèÒª²úÉú shared library)

    ÎһὨÒéÄã×îºÃҲʹÓà GNU C/C++ ±àÒëÆ÷ ¡¢GNU Make ÒÔ¼°ÆäËü GNU µÄ¹¤¾ß³ÌʽÀ´×öΪ¿ª·¢µÄ»·¾³£¬ÕâЩ¹¤¾ß¶¼ÊÇÊôì¶ Open Source Software²»½öÃâ·Ñ¶øÇÒ¹¦ÄÜÇ¿´ó¡£Èç¹ûÄãÊÇʹÓÃRed Hat Linux ¿ÉÒÔÕÒµ½ËùÓÐÉÏÊöÈíÌåµÄ rpm µµ£¬FreeBSD Ò²ÓÐÏÖ³ÉµÄ package ¿ÉÒÔÖ±
½Ó°²×°£¬»ò×ÅÄãÒ²¿ÉÒÔ×ÔÐÐÏÂÔØÕâЩÈíÌåµÄԭʼµµ»ØÀ´ DIY¡£ÒÔϵķ¶ÀýÊÇÔÚ Red Hat Linux 5.2 + CLE2 µÄ»·¾³ÏÂËùÍê³ÉµÄ¡£

3. Ò»¸ö¼òµ¥µÄÀý×Ó

    Automake Ëù²úÉúµÄ Makefile ³ýÁË¿ÉÒÔ×öµ½³ÌʽµÄ±àÒëºÍÁ¬½á£¬Ò²ÒѾ­°ÑÈçºÎ²úÉú³ÌʽÎļþ(Èç manual page, info µµ¼° dvi µµ) µÄ¶¯×÷£¬»¹ÓаÑԭʼ³Ìʽ°ü×°ÆðÀ´ÒÔ¹©É¢¡¡µÄ¶¯×÷¶¼¿¼ÂǽøÈ¥ÁË£¬ËùÒÔԭʼ³ÌʽËù´æ·ÅµÄĿ¼¼Ü¹¹×îºÃ·ûºÏ GNU µÄ±ê×¼¹ßÀý£¬½ÓÏÂÀ´ÎÒÄÃhello.c À´×öΪÀý×Ó¡£

    ÔÚ¹¤×÷Ŀ¼Ï½¨Á¢Ò»¸öеÄ×ÓĿ¼ ``devel''£¬ÔÙÔÚ devel Ͻ¨Á¢Ò»¸ö``hello'' µÄ×ÓĿ¼£¬Õâ¸öĿ¼½«×÷ΪÎÒÃÇ´æ·Å hello Õâ¸ö³Ìʽ¼°ÆäÏà¹Øµµ°¸µÄµØ·½£º

% mkdir devel
% cd devel
% mkdir hello
% cd hello

Óñ༭Æ÷д¸ö hello.c µµ£¬
#include stdio.h
int main(int argc, char** argv)
{
printf(``Hello, GNU! '');
return 0;
}

    ½ÓÏÂÀ´¾ÍÒªÓà Autoconf ¼° Automake À´°ïÎÒÃDzúÉú Makefile µµÁË£¬

1. Óà autoscan ²úÉúÒ»¸ö configure.in µÄ³ûÐÍ£¬Ö´ÐÐ autoscan áá»á²úÉúÒ»¸öconfigure.scan µÄµµ°¸£¬ÎÒÃÇ¿ÉÒÔÓÃËü×öΪconfigure.inµµµÄÀ¶±¾¡£

% autoscan
% ls
configure.scan hello.c

2. ±à¼­ configure.scan µµ£¬ÈçÏÂËùʾ£¬²¢ÇÒ°ÑËüµÄµµÃû¸Ä³Éconfigure.in
dnl Process this file with autoconf to produce a con figure script.
AC_INIT(hello.c)
AM_INIT_AUTOMAKE(hello, 1.0)
dnl Checks for programs.
AC_PROG_CC
dnl Checks for libraries.
dnl Checks for header files.
dnl Checks for typedefs, structures, and compiler ch aracteristics.
dnl Checks for library functions.
AC_OUTPUT(Makefile)

3. Ö´ÐÐ aclocal ºÍ autoconf £¬·Ö±ð»á²úÉú aclocal.m4 ¼° configure Á½¸öµµ°¸
% aclocal
% autoconf
% ls
aclocal.m4 configure configure.in hello.c

4. ±à¼­ Makefile.am µµ£¬ÄÚÈÝÈçÏÂ
AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= hello
hello_SOURCES= hello.c

5. Ö´ÐÐ automake --add-missing £¬Automake »á¸ù¾Ý Makefile.am µµ²úÉúһЩµµ°¸£¬°üº¬×îÖØÒªµÄ Makefile.in
% automake --add-missing
automake: configure.in: installing `./install-sh'
automake: configure.in: installing `./mkinstalldirs'
automake: configure.in: installing `./missing'

6. ×îááÖ´ÐÐ ./configure £¬
% ./configure
creating cache ./config.cache
checking for a BSD compatible install... /usr/bin/in stall -c
checking whether build environment is sane... yes
checking whether make sets ${MAKE}... yes
checking for working aclocal... found
checking for working autoconf... found
checking for working automake... found
checking for working autoheader... found
checking for working makeinfo... found
checking for gcc... gcc
checking whether the C compiler (gcc ) works... yes
checking whether the C compiler (gcc ) is a cross-co mpiler... no
checking whether we are using GNU C... yes
checking whether gcc accepts -g... yes
updating cache ./config.cache
creating ./config.status
creating Makefile

    ÏÖÔÚÄãµÄĿ¼ÏÂÒѾ­²úÉúÁËÒ»¸ö Makefile µµ£¬Ï¸ö ``make'' Ö¸Áî¾Í¿ÉÒÔ¿ªÊ¼±àÒë hello.c ³ÉÖ´Ðеµ£¬Ö´ÐÐ ./hello ºÍ GNU ´òÉùÕкô°É£¡

% make
gcc -DPACKAGE="hello" -DVERSION="1.0" -I. -I. -g -O2 -c he llo.c
gcc -g -O2 -o hello hello.o
% ./hello
Hello! GNU!

    Ä㻹¿ÉÒÔÊÔÊÔ ``make clean''£¬''make install''£¬''make dist'' ¿´¿´»áÓÐʲ÷á½á¹û¡£ÄãÒ²¿ÉÒ԰ѲúÉú³öÀ´µÄ Makefile Ðã¸øÄãµÄÀϰ壬ÈÃËû´Ó´Ë¶ÔÄã¹ÎÄ¿Ïà¿´ :-)

4. һ̽¾¿¾¹

    ÉÏÊö²úÉú Makefile µÄ¹ý³ÌºÍÒÔÍù×ÔÐбàдµÄ·½Ê½·Ç³£²»Ò»Ñù£¬ÉáÆú´«Í³×ÔÐж¨Òå make µÄ¹æÔò£¬Ê¹Óà Automake Ö»ÐèÓõ½Ò»Ð©ÒѾ­¶¨ÒåºÃµÄ¾Þ¼¯¼´¿É¡£ÎÒÃǰѾ޼¯¼°Ä¿±ê (target)дÔÚ Makefile.am µµÄÚ£¬Automake¶ÁÈë Makefile.am µµáá»á°ÑÕâÒ»´®ÒѾ­¶¨ÒåºÃµÄ¾Þ¼¯Õ¹
¿ª²¢ÇÒ²úÉú¶ÔÓ¦µÄMakefile.in µµ£¬ È»ááÔÙÓÉ configure Õâ¸ö shell script ¸ù¾ÝMakefile.in ²úÉúÊÊºÏµÄ Makefile¡£
    ÔÚ´Ë·¶ÀýÖпɽåÓÉ Autoconf ¼° Automake ¹¤¾ßËù²úÉúµÄµµ°¸ÓÐ configure.scan¡¢aclocal.m4¡¢configure¡¢Makefile.in£¬ÐèÒªÎÒÃǼÓÈëÉ趨ÕßΪ configure.in ¼° Makefile.am¡£

4.1 ±à¼­ configure.in µµ

    Autoconf ÊÇÓÃÀ´²úÉú 'configure' µµµÄ¹¤¾ß¡£'configure' ÊÇÒ»¸öshell script£¬Ëü¿ÉÒÔ×Ô¶¯É趨ԭʼ³ÌʽÒÔ·ûºÏ¸÷ÖÖ²»Í¬Æ½Ì¨ÉÏ Unix ϵͳµÄÌØÐÔ£¬²¢ÇÒ¸ù¾ÝϵͳÈþÊý¼°»·¾³²úÉúºÏÊ浀 Makefile µµ»òÊÇC µÄ±êÍ·µµ (header file)£¬ÈÃԭʼ³Ìʽ¿ÉÒԺܷ½±ãµØÔÚÕâЩ²»Í¬
µÄƽ̨Éϱ»±àÒë³öÀ´¡£Autoconf »á¶ÁÈ¡ configure.in µµÈ»áá²úÉú 'configure' Õâ¸öshell script¡£

    configure.in µµµÄÄÚÈÝÊÇÒ»Á¬´® GNU m4 µÄ¾Þ¼¯£¬ÕâЩ¾Þ¼¯¾­¹ýautoconf ´¦Àíáá»á±ä³É¼ì²éÏµÍ³ÌØáçµÄ shell script¡£configure.in ÄÚ¾Þ¼¯µÄ˳Ðò²¢Ã»ÓÐÌØ±ðµÄ¹æ¶¨£¬µ«ÊÇÿһ¸ö configure.in µµ±ØÐëÔÚËùÓо޼¯Ç°¼ÓÈë AC_INIT ¾Þ¼¯£¬È»ááÔÚËùÓо޼¯µÄ×îááÃæ¼ÓÉÏ AC
_OUTPUT ¾Þ¼¯¡£ÎÒÃÇ¿ÉÏÈÓà autoscan ɨÃèԭʼµµÒÔ²úÉúÒ»¸ö configure.scan µµ£¬ÔÙ¶Ô configure.scan ×öЩÐÞ¸Ä³É configure.in µµ¡£ÔÚ·¶ÀýÖÐËùÓõ½µÄ¾Þ¼¯ÈçÏ£º

dnl
    Õâ¸ö¾Þ¼¯ááÃæµÄ×Ö²»»á±»´¦Àí£¬¿ÉÊÓΪע½â¡£

AC_INIT(FILE)
    Õâ¸ö¾Þ¼¯ÓÃÀ´¼ì²éԭʼÂëËùÔڵķ¾¶£¬autoscan »á×Ô¶¯²úÉú£¬ÎÒÃDz»±ØÐÞ¸ÄËü¡£

AM_INIT_AUTOMAKE(PACKAGE,VERSION)
    ÕâÊÇʹÓà Automake Ëù±Ø±¸µÄ¾Þ¼¯£¬PACKAGE ÊÇÎÒÃÇËùÒª²úÉúÈíÌåÌ×¼þµÄÃû³Æ£¬VERSION Êǰ汾±àºÅ¡£

AC_PROG_CC
    ¼ì²éϵͳ¿ÉÓÃµÄ C ±àÒëÆ÷£¬Èç¹ûԭʼ³ÌʽÊÇÓà C дµÄ¾ÍÐèÒªÕâ¸ö¾Þ¼¯¡£

AC_OUTPUT(FILE)
    É趨 configure ËùÒª²úÉúµÄµµ°¸£¬Èç¹ûÊÇ Makefile µÄ»°£¬configure ±ã»á°ÑËü¼ì²é³öÀ´µÄ½á¹û´øÈë Makefile.in µµÈ»áá²úÉú
ºÏÊ浀 Makefile¡£

    ʵ¼ÊÉÏ£¬ÎÒÃÇʹÓà Automake ʱ£¬»¹ÐëҪһЩÆäËüµÄ¾Þ¼¯£¬ÕâЩ¶îÍâµÄ¾Þ¼¯ÎÒÃÇÓà aclocalÀ´°ïÎÒÃDzúÉú¡£Ö´ÐÐ aclocal »á²úÉú aclocal.m4µµ£¬Èç¹ûûÓÐÌØ±ðµÄÓÃ;£¬ÎÒÃÇ¿ÉÒÔ²»±ØÐÞ¸ÄËü£¬Óà aclocal Ëù²úÉúµÄ¾Þ¼¯»á¸æËß Automake Ôõ÷á×ö¡£

    ÓÐÁË configure.in ¼° aclocal.m4 Á½¸öµµ°¸áᣬ±ã¿ÉÒÔÖ´ÐÐ autoconfÀ´²úÉú configureµµÁË¡£

4.2 ±à¼­ Makefile.am µµ

    ½ÓÏÂÀ´ÎÒÃÇÒª±à¼­ Makefile.am µµ£¬Automake »á¸ù¾Ý configure.in Öеľ޼¯°ÑMakefile.am ת³É Makefile.in µµ¡£Makefile.am µµ¶¨ÒåÎÒÃÇËùÒª²úµÄÄ¿±ê£º

AUTOMAKE_OPTIONS
    É趨 automake µÄÑ¡Ïî¡£Automake Ö÷ÒªÊǰïÖú¿ª·¢ GNU ÈíÌåµÄÈËԱά»¤ÈíÌåÌ×¼þ£¬ËùÒÔÔÚÖ´ÐÐ automake ʱ£¬»á¼ì²éĿ¼ÏÂÊÇ·ñ´æÔÚ±ê×¼ GNU ÈíÌåÌ×¼þÖÐÓ¦¾ß±¸µÄÎļþµµ°¸£¬ÀýÈç 'NEWS'¡¢'AUTHOR'¡¢'ChangeLog' µÈÎļþµµ¡£Éè³É foreign ʱ£¬automake »á¸ÄÓÃÒ»°ãÈí
ÌåÌ×¼þµÄ±ê×¼À´¼ì²é¡£

bin_PROGRAMS
    ¶¨ÒåÎÒÃÇËùÒª²úÉúµÄÖ´ÐеµµµÃû¡£Èç¹ûÒª²úÉú¶à¸öÖ´Ðеµ£¬Ã¿¸öµµÃûÓÿհ××ÖÔª¸ô¿ª¡£

hello_SOURCES
    ¶¨Òå 'hello' Õâ¸öÖ´ÐеµËùÐèÒªµÄԭʼµµ¡£Èç¹û 'hello' Õâ¸ö³ÌʽÊÇÓɶà¸öԭʼµµËù²úÉú£¬±ØÐë°ÑËüËùÓõ½µÄԭʼµµ¶¼ÁгöÀ´£¬ÒÔ¿Õ°××ÖÔª¸ô¿ª¡£¼ÙÉè 'hello' Õâ¸ö³ÌʽÐèÒª 'hello.c'¡¢'main.c'¡¢

'hello.h'
    Èý¸öµµ°¸µÄ»°£¬Ôò¶¨Òå
        hello_SOURCES= hello.c main.c hello.h
    Èç¹ûÎÒÃǶ¨Òå¶à¸öÖ´Ðеµ£¬Ôò¶Ôÿ¸öÖ´Ðеµ¶¼Òª¶¨ÒåÏà¶ÔµÄfilename_SOURCES¡£

    ±à¼­ºÃ Makefile.am µµ£¬¾Í¿ÉÒÔÓà automake --add-missing À´²úÉúMakefile.in¡£¼ÓÉÏ --add-missing Ñ¡ÏîÊǸæËß automake ˳±ã°ïÎÒÃǼÓÈë°ü×°Ò»¸öÈíÌåÌ×¼þËù±Ø±¸µÄµµ°¸¡£Automake ²úÉú³öÀ´µÄ Makefile.inµµÊÇÍêÈ«·ûºÏ GNU Makefile µÄ¹ßÀý£¬ÎÒÃÇÖ»ÒªÖ´ÐÐ confi
gure Õâ¸öshell script ±ã¿ÉÒÔ²úÉúºÏÊ浀 Makefile µµÁË¡£

4.3 ʹÓà Makefile

    ÀûÓà configure Ëù²úÉúµÄ Makefile µµÓм¸¸öÔ¤ÉèµÄÄ¿±ê¿É¹©Ê¹Óã¬ÎÒÃÇÖ»ÄÃÆäÖм¸¸ö¼òÊöÈçÏ£º

make all
    ²úÉúÎÒÃÇÉ趨µÄÄ¿±ê£¬¼´´Ë·¶ÀýÖеÄÖ´Ðеµ¡£Ö»´ò make Ò²¿ÉÒÔ£¬´Ëʱ»á¿ªÊ¼±àÒëԭʼÂ룬ȻááÁ¬½á£¬²¢ÇÒ²úÉúÖ´Ðеµ¡£

make clean
    Çå³ý֮ǰËù±àÒëµÄÖ´Ðеµ¼°Ä¿µÄµµ (object file, *.o)¡£

make distclean
    ³ýÁËÇå³ýÖ´ÐеµºÍÄ¿µÄµµÍ⣬Ҳ°Ñ configure Ëù²úÉúµÄ MakefileÒ²Çå³ýµô¡£

make install
    ½«³Ìʽ°²×°ÖÁϵͳÖС£Èç¹ûԭʼÂë±àÒëÎÞÎó£¬ÇÒÖ´Ðнá¹ûÕýÈ·£¬±ã¿ÉÒ԰ѳÌʽ°²×°ÖÁϵͳԤÉèµÄÖ´Ðеµ´æ·Å·¾¶¡£Èç¹ûÎÒÃÇÓÃbin_PROGRAMS ¾Þ¼¯µÄ»°£¬³Ìʽ»á±»°²×°ÖÁ /usr/local/bin Õâ¸öĿ¼¡£

make dist
    ½«³ÌʽºÍÏà¹ØµÄµµ°¸°ü×°³ÉÒ»¸öѹËõµµÒÔ¹©É¢²¥ (distribution) ¡£Ö´ÐÐÍêÔÚĿ¼Ï»á²úÉúÒ»¸öÒÔ PACKAGE-VERSION.tar.gz ΪÃû³ÆµÄµµ°¸¡£PACKAGE ºÍ VERSION ÕâÁ½¸ö±äÊýÊǸù¾Ý configure.in µµÖÐAM_INIT_AUTOMAKE(PACKAGE, VERSION) µÄ¶¨Òå¡£ÔÚ´Ë·¶ÀýÖлá²úÉú
'hello-1.0.tar.gz' µÄµµ°¸¡£

make distcheck
    ºÍ make dist ÀàËÆ£¬µ«ÊǼÓÈë¼ì²é°ü×°ááµÄѹËõµµÊÇ·ñÕý³£¡£Õâ¸öÄ¿±ê³ýÁ˰ѳÌʽºÍÏà¹Øµµ°¸°ü×°³É tar.gz µµÍ⣬»¹»á×Ô¶¯°ÑÕâ¸öѹ
Ëõµµ½â¿ª£¬Ö´ÐÐ configure£¬²¢ÇÒ½øÐÐ make all µÄ¶¯×÷£¬È·ÈϱàÒëÎÞÎóáᣬ»áÏÔʾÕâ¸ö tar.gz µµÒѾ­×¼±¸ºÃ¿É¹©É¢²¥ÁË¡£Õâ¸ö¼ì²é·Ç
³£ÓÐÓ㬼ì²é¹ý¹ØµÄÌ×¼þ£¬»ù±¾ÉÏ¿ÉÒÔ¸øÈκÎÒ»¸ö¾ß±¸ GNU ·¢Õ¹¾³µÄÈËÈ¥ÖØÐ±àÒë¡£¾Í hello-1.tar.gz Õâ¸ö·¶Àý¶øÑÔ£¬³ýÁËÔÚ Red
Hat Linux ÉÏ£¬ÔÚ FreeBSD 2.2.x °æÒ²¿ÉÒÔÕýÈ·µØÖØÐ±àÒë¡£

    ҪעÒâµÄÊÇ£¬ÀûÓà Autoconf ¼° Automake Ëù²úÉú³öÀ´µÄÈíÌåÌ×¼þÊÇ¿ÉÒÔÔÚûÓа²×° Autoconf ¼° Automake µÄ»·¾³ÉÏʹÓõģ¬ÒòΪ configure ÊÇÒ»¸ö shell script£¬Ëü¼º±»Éè¼Æ¿ÉÒÔÔÚÒ»°ã Unix µÄ sh Õâ¸ö shell ÏÂÖ´ÐС£µ«ÊÇÈç¹ûÒªÐÞ¸Ä configure.in ¼° Makefile.a
m µµÔÙ²úÉúеÄconfigure ¼° Makefile.in µµÊ±¾ÍÒ»¶¨ÒªÓÐ Autoconf ¼° Automake ÁË¡£

5. Ïà¹ØÑ¶Ï¢

    Autoconf ºÍ Automake ¹¦ÄÜÊ®·ÖÇ¿´ó£¬Äã¿ÉÒÔ´ÓËüÃÇËù¸½µÄ info µµÕÒµ½ÏêϸµÄÓ÷¨¡£ÄãÒ²¿ÉÒÔ´ÓÐí¶àÏÖ´æµÄ GNU ÈíÌå»ò Open Source ÈíÌåÖÐÕÒµ½Ïà¹ØµÄ configure.in »ò Makefile.am µµ£¬ËüÃÇÊÇѧϰ Autoconf ¼°Automake ¸ü¶à¼¼ÇɵÄ×î¼Ñ·¶Àý¡£

    ÕâÆª¼ò½éÖ»Óõ½ÁË Autoconf ¼° Automake µÄƤë°ÕÁË£¬Èç¹ûÄãÓÐÐļÓÈëOpen Source ÈíÌ忪·¢µÄÐÐÁУ¬Ï£ÍûÕâÆªÎļþÄܰïÖúÄã¶Ô²úÉú MakefileÓиö¼òµ¥µÄÒÀ¾Ý¡£ÆäËüÓйؿª·¢ GNU³Ìʽ»ò C ³ÌʽÉè¼Æ¼° Makefile µÄÏêϸÔËÓü°¼¼ÇÉ£¬ÎÒ½¨ÒéÄã´Ó GNU Coding Standards3
(GNU ±àÂë±ê×¼¹æ¶¨) ¶ÁÆð£¬ÀïÃæ°üº¬ÁË GNU Makefile ¹ßÀý£¬»¹Óз¢Õ¹ GNU ÈíÌåÌ×¼þµÄ±ê×¼³ÌÐòºÍ¹ßÀý¡£ÕâЩ GNU ÈíÌåµÄÏßÉÏ˵Ã÷Îļþ¿ÉÒÔÔÚhttp://www.gnu.org/ Õâ¸öÍøÕ¾ÉÏÕÒµ½¡£

6. ½áÓï

    ¾­ÓÉ Autoconf ¼° Automake µÄ¸¨Öú£¬²úÉúÒ»¸ö Makefile ËÆºõ²»ÔÙÏñÒÔǰÄÇ÷áÀ§ÄÑÁË£¬¶øÊ¹Óà Autoconf ҲʹµÃÎÒÃÇÔÚ²»Í¬Æ½Ì¨ÉÏ»ò¸÷¼Ò UnixÖ®¼äÉ¢²¥¼°±àÒë³Ìʽ±äµÃ¼òµ¥£¬Õâ¶Ôì¶ÔÚ Unix ϵͳÉÏ¿ª·¢³ÌʽµÄÈËÔ±À´Ëµ¼õÇáÁËÐí¶à¸ºµ£¡£Í×ÉÆÔËÓÃÕâЩ GNU µÄ¹¤¾ßÈíÌ壬¿É
ÒÔ°ïÖúÎÒÃǸüÈÝÒ×È¥·¢Õ¹³Ìʽ£¬¶øÇÒ¸üÈÝÒ×ά»¤Ô­Ê¼³ÌʽÂë¡£

    Ò»¾Å¾Å°ËÄêÊÇ Open Source Ô˶¯·çÆðÔÆÓ¿µÄÒ»Ä꣬Ðí¶à Open Source µÄÈíÌåÆÕ±éÊܵ½ÍøÂ·ÉÏ´óÖڵ϶ӭºÍʹÓ᣸ÐлËùÓÐΪ Open Source ·îÏ×µÄÈËÃÇ£¬Ò²Ï£Íû½åÓɱ¾ÎÄÄÜÎüÒý¸ü¶àµÄÈ˼ÓÈ롺×ÔÓÉ¡»¡¢¡º¿ª·Å¡»µÄ OpenSource ÐÐÁС£

About this document ...

ÇáÇáËÉËɲúÉú Makefile1

This document was generated using the LaTeX2HTML translator Version 98.2 beta6 (August 14th, 1998) Copyright (C) 1993, 1994, 1995, 1996, Nikos Drakos, ComputerBased Learning Unit, University of Leeds.Copyright (C) 1997, 1998, Ross Moore, Mathematics Department,Macquarie University, Sydney.

The command line arguments were:
latex2html -split 0 -show_section_numbers automake.tex
The translation was initiated by on 1999-02-11

Footnotes
... itle1
±¾ÎļþʹÓà ChiLaTeX ÖÆ×÷¡£
... CLE2
CLE (Chinese Linux Extension£¬Linux ÖÐÎÄÑÓÉìÌ×¼þ),
http://cle.linux.org.tw/

... Standards3
GNU Coding Standards, Richard Stallman.

[Ŀ¼]


gcc_egcsʹÓÃ

1.ʹÓÃegcs

    Linux ÖÐ×îÖØÒªµÄÈí¼þ¿ª·¢¹¤¾ßÊÇ GCC¡£GCC ÊÇ GNU µÄ C ºÍ C++ ±àÒëÆ÷¡£Êµ¼ÊÉÏ£¬GCC Äܹ»±àÒëÈýÖÖÓïÑÔ£ºC¡¢C++ ºÍ Object C£¨C ÓïÑÔµÄÒ»ÖÖÃæÏò¶ÔÏóÀ©Õ¹£©¡£ÀûÓà gcc ÃüÁî¿Éͬʱ±àÒë²¢Á¬½Ó C ºÍ C++ Ô´³ÌÐò¡£

        #DEMO#: hello.c

    Èç¹ûÄãÓÐÁ½¸ö»òÉÙÊý¼¸¸ö C Ô´Îļþ£¬Ò²¿ÉÒÔ·½±ãµØÀûÓà GCC ±àÒë¡¢Á¬½Ó²¢Éú³É¿ÉÖ´ÐÐÎļþ¡£ÀýÈ磬¼ÙÉèÄãÓÐÁ½¸öÔ´Îļþ main.c ºÍ factorial.c Á½¸öÔ´Îļþ£¬ÏÖÔÚÒª±àÒëÉú³ÉÒ»¸ö¼ÆËã½×³ËµÄ³ÌÐò¡£

-----------------------
Çåµ¥ factorial.c
-----------------------
#include <stdio.h>
#include <stdlib.h>

int factorial (int n)
{
    if (n <= 1)
        return 1;

    else
        return factorial (n - 1) * n;
}
-----------------------

-----------------------
Çåµ¥  main.c
-----------------------
#include <stdio.h>
#include <stdlib.h>

int factorial (int n);

int main (int argc, char **argv)
{
    int n;

    if (argc < 2) {
        printf ("Usage: %s n\n", argv [0]);
        return -1;
    }
    else {
        n = atoi (argv[1]);
        printf ("Factorial of %d is %d.\n", n, factorial (n));
    }

    return 0;
}
-----------------------

    ÀûÓÃÈçϵÄÃüÁî¿É±àÒëÉú³É¿ÉÖ´ÐÐÎļþ£¬²¢Ö´ÐгÌÐò£º

$ gcc -o factorial main.c factorial.c
$ ./factorial 5
Factorial of 5 is 120.

    GCC ¿ÉͬʱÓÃÀ´±àÒë C ³ÌÐòºÍ C++ ³ÌÐò¡£Ò»°ãÀ´Ëµ£¬C ±àÒëÆ÷ͨ¹ýÔ´ÎļþµÄºó׺ÃûÀ´ÅжÏÊÇ C ³ÌÐò»¹ÊÇ C++ ³ÌÐò¡£ÔÚ Linux ÖУ¬C Ô´ÎļþµÄºó׺ÃûΪ .c£¬¶ø C++ Ô´ÎļþµÄºó׺ÃûΪ .C »ò .cpp¡£

    µ«ÊÇ£¬gcc ÃüÁîÖ»ÄܱàÒë C++ Ô´Îļþ£¬¶ø²»ÄÜ×Ô¶¯ºÍ C++ ³ÌÐòʹÓõĿâÁ¬½Ó¡£Òò´Ë£¬Í¨³£Ê¹Óà g++ ÃüÁîÀ´Íê³É C++ ³ÌÐòµÄ±àÒëºÍÁ¬½Ó£¬¸Ã³ÌÐò»á×Ô¶¯µ÷Óà gcc ʵÏÖ±àÒë¡£¼ÙÉèÎÒÃÇÓÐÒ»¸öÈçÏ嵀 C++ Ô´Îļþ£¨hello.C£©£º

#include <iostream.h>

void main (void)
{
    cout << "Hello, world!" << endl;
}

    Ôò¿ÉÒÔÈçϵ÷Óà g++ ÃüÁî±àÒë¡¢Á¬½Ó²¢Éú³É¿ÉÖ´ÐÐÎļþ£º

$ g++ -o hello hello.C
$ ./hello
Hello, world!

2.  gcc/egcs µÄÖ÷ҪѡÏî

                ±í 1-3  gcc ÃüÁîµÄ³£ÓÃÑ¡Ïî
Ñ¡Ïî                ½âÊÍ
-ansi               Ö»Ö§³Ö ANSI ±ê×¼µÄ C Óï·¨¡£ÕâһѡÏ½ûÖ¹ GNU C µÄÄ³Ð©ÌØÉ«£¬
                    ÀýÈç asm »ò typeof ¹Ø¼ü´Ê¡£
-c                  Ö»±àÒë²¢Éú³ÉÄ¿±êÎļþ¡£
-DMACRO             ÒÔ×Ö·û´®¡°1¡±¶¨Òå MACRO ºê¡£
-DMACRO=DEFN        ÒÔ×Ö·û´®¡°DEFN¡±¶¨Òå MACRO ºê¡£
-E                  Ö»ÔËÐÐ C Ô¤±àÒëÆ÷¡£
-g                  Éú³Éµ÷ÊÔÐÅÏ¢¡£GNU µ÷ÊÔÆ÷¿ÉÀûÓøÃÐÅÏ¢¡£
-IDIRECTORY         Ö¸¶¨¶îÍâµÄÍ·ÎļþËÑË÷·¾¶DIRECTORY¡£
-LDIRECTORY         Ö¸¶¨¶îÍâµÄº¯Êý¿âËÑË÷·¾¶DIRECTORY¡£
-lLIBRARY           Á¬½ÓʱËÑË÷Ö¸¶¨µÄº¯Êý¿âLIBRARY¡£
-m486               Õë¶Ô 486 ½øÐдúÂëÓÅ»¯¡£
-o FILE             Éú³ÉÖ¸¶¨µÄÊä³öÎļþ¡£ÓÃÔÚÉú³É¿ÉÖ´ÐÐÎļþʱ¡£
-O0                 ²»½øÐÐÓÅ»¯´¦Àí¡£
-O »ò -O1           ÓÅ»¯Éú³É´úÂë¡£
-O2                 ½øÒ»²½ÓÅ»¯¡£
-O3                 ±È -O2 ¸ü½øÒ»²½ÓÅ»¯£¬°üÀ¨ inline º¯Êý¡£
-shared             Éú³É¹²ÏíÄ¿±êÎļþ¡£Í¨³£ÓÃÔÚ½¨Á¢¹²Ïí¿âʱ¡£
-static             ½ûֹʹÓù²ÏíÁ¬½Ó¡£
-UMACRO             È¡Ïû¶Ô MACRO ºêµÄ¶¨Òå¡£
-w                  ²»Éú³ÉÈκξ¯¸æÐÅÏ¢¡£
-Wall               Éú³ÉËùÓо¯¸æÐÅÏ¢¡£

#DEMO#

[Ŀ¼]


gdbʹÓÃ

1.¼ò½é

    GNU µÄµ÷ÊÔÆ÷³ÆÎª gdb£¬¸Ã³ÌÐòÊÇÒ»¸ö½»»¥Ê½¹¤¾ß£¬¹¤×÷ÔÚ×Ö·ûģʽ¡£ÔÚ X Window ϵͳÖУ¬ÓÐÒ»¸ö gdb µÄǰ¶ËͼÐι¤¾ß£¬³ÆÎª xxgdb¡£gdb Êǹ¦ÄÜÇ¿´óµÄµ÷ÊÔ³ÌÐò£¬¿ÉÍê³ÉÈçϵĵ÷ÊÔÈÎÎñ£º

* ÉèÖöϵ㣻
* ¼àÊÓ³ÌÐò±äÁ¿µÄÖµ£»
* ³ÌÐòµÄµ¥²½Ö´ÐУ»
* Ð޸ıäÁ¿µÄÖµ¡£
    ÔÚ¿ÉÒÔʹÓà gdb µ÷ÊÔ³ÌÐò֮ǰ£¬±ØÐëʹÓà -g Ñ¡Ïî±àÒëÔ´Îļþ¡£¿ÉÔÚ makefile ÖÐÈç϶¨ÒåCFLAGS ±äÁ¿£º

CFLAGS = -g
ÔËÐÐ gdb µ÷ÊÔ³ÌÐòʱͨ³£Ê¹ÓÃÈçϵÄÃüÁ

gdb progname

    ÔÚ gdb Ìáʾ·û´¦¼üÈëhelp£¬½«ÁгöÃüÁîµÄ·ÖÀ࣬Ö÷ÒªµÄ·ÖÀàÓУº

* aliases£ºÃüÁî±ðÃû
* breakpoints£º¶Ïµã¶¨Ò壻
* data£ºÊý¾Ý²é¿´£»
* files£ºÖ¸¶¨²¢²é¿´Îļþ£»
* internals£ºÎ¬»¤ÃüÁ
* running£º³ÌÐòÖ´ÐУ»
* stack£ºµ÷ÓÃÕ»²é¿´£»
* statu£º×´Ì¬²é¿´£»
* tracepoints£º¸ú×Ù³ÌÐòÖ´ÐС£

¼üÈë help ºó¸úÃüÁîµÄ·ÖÀàÃû£¬¿É»ñµÃ¸ÃÀàÃüÁîµÄÏêϸÇåµ¥¡£

2.gdb µÄ³£ÓÃÃüÁî
                ±í 1-4  ³£ÓÃµÄ gdb ÃüÁî
ÃüÁî                        ½âÊÍ
break NUM               ÔÚÖ¸¶¨µÄÐÐÉÏÉèÖöϵ㡣
bt                      ÏÔʾËùÓеĵ÷ÓÃÕ»Ö¡¡£¸ÃÃüÁî¿ÉÓÃÀ´ÏÔʾº¯ÊýµÄµ÷ÓÃ˳Ðò¡£
clear                   ɾ³ýÉèÖÃÔÚÌØ¶¨Ô´Îļþ¡¢Ìض¨ÐÐÉϵĶϵ㡣ÆäÓ÷¨Îª£ºclear FILENAME:NUM¡£
continue                ¼ÌÐøÖ´ÐÐÕýÔÚµ÷ÊԵijÌÐò¡£¸ÃÃüÁîÓÃÔÚ³ÌÐòÓÉÓÚ´¦ÀíÐźŻò¶Ïµã¶ø
                        µ¼ÖÂÍ£Ö¹ÔËÐÐʱ¡£
display EXPR            ÿ´Î³ÌÐòÍ£Ö¹ºóÏÔʾ±í´ïʽµÄÖµ¡£±í´ïʽÓɳÌÐò¶¨ÒåµÄ±äÁ¿×é³É¡£
file FILE               ×°ÔØÖ¸¶¨µÄ¿ÉÖ´ÐÐÎļþ½øÐе÷ÊÔ¡£
help NAME               ÏÔʾָ¶¨ÃüÁîµÄ°ïÖúÐÅÏ¢¡£
info break              ÏÔʾµ±Ç°¶ÏµãÇåµ¥£¬°üÀ¨µ½´ï¶Ïµã´¦µÄ´ÎÊýµÈ¡£
info files              ÏÔʾ±»µ÷ÊÔÎļþµÄÏêϸÐÅÏ¢¡£
info func               ÏÔʾËùÓеĺ¯ÊýÃû³Æ¡£
info local              ÏÔʾµ±º¯ÊýÖеľֲ¿±äÁ¿ÐÅÏ¢¡£
info prog               ÏÔʾ±»µ÷ÊÔ³ÌÐòµÄÖ´ÐÐ״̬¡£
info var                ÏÔʾËùÓеÄÈ«¾ÖºÍ¾²Ì¬±äÁ¿Ãû³Æ¡£
kill                    ÖÕÖ¹Õý±»µ÷ÊԵijÌÐò¡£
list                    ÏÔʾԴ´úÂë¶Î¡£
make                    ÔÚ²»Í˳ö gdb µÄÇé¿öÏÂÔËÐÐ make ¹¤¾ß¡£
next                    ÔÚ²»µ¥²½Ö´ÐнøÈëÆäËûº¯ÊýµÄÇé¿öÏ£¬ÏòǰִÐÐÒ»ÐÐÔ´´úÂë¡£
print EXPR              ÏÔʾ±í´ïʽ EXPR µÄÖµ¡£

3.gdb ʹÓ÷¶Àý

-----------------
Çåµ¥  Ò»¸öÓдíÎóµÄ C Ô´³ÌÐò bugging.c
-----------------
#include <stdio.h>
#include <stdlib.h>

static char buff [256];
static char* string;
int main ()
{

    printf ("Please input a string: ");
    gets (string);

    printf ("\nYour string is: %s\n", string);
}
-----------------

    ÉÏÃæÕâ¸ö³ÌÐò·Ç³£¼òµ¥£¬ÆäÄ¿µÄÊǽÓÊÜÓû§µÄÊäÈ룬Ȼºó½«Óû§µÄÊäÈë´òÓ¡³öÀ´¡£¸Ã³ÌÐòʹÓÃÁËÒ»¸öδ¾­¹ý³õʼ»¯µÄ×Ö·û´®µØÖ· string£¬Òò´Ë£¬±àÒë²¢ÔËÐÐÖ®ºó£¬½«³öÏÖ Segment Fault ´íÎó£º

$ gcc -o test -g test.c
$ ./test
Please input a string: asfd
Segmentation fault (core dumped)

ΪÁ˲éÕҸóÌÐòÖгöÏÖµÄÎÊÌ⣬ÎÒÃÇÀûÓà gdb£¬²¢°´ÈçϵIJ½Öè½øÐУº

1£®ÔËÐÐ gdb bugging ÃüÁװÈë bugging ¿ÉÖ´ÐÐÎļþ£»
2£®Ö´ÐÐ×°ÈëµÄ bugging ÃüÁ
3£®Ê¹Óà where ÃüÁî²é¿´³ÌÐò³ö´íµÄµØ·½£»
4£®ÀûÓà list ÃüÁî²é¿´µ÷Óà gets º¯Êý¸½½üµÄ´úÂ룻
5£®Î¨Ò»Äܹ»µ¼Ö gets º¯Êý³ö´íµÄÒòËØ¾ÍÊDZäÁ¿ string¡£Óà print ÃüÁî²é¿´ string µÄÖµ£»
6£®ÔÚ gdb ÖУ¬ÎÒÃÇ¿ÉÒÔÖ±½ÓÐ޸ıäÁ¿µÄÖµ£¬Ö»Òª½« string ȡһ¸öºÏ·¨µÄÖ¸ÕëÖµ¾Í¿ÉÒÔÁË£¬Îª
´Ë£¬ÎÒÃÇÔÚµÚ 11 Ðд¦ÉèÖöϵ㣻
7£®³ÌÐòÖØÐÂÔËÐе½µÚ 11 Ðд¦Í£Ö¹£¬Õâʱ£¬ÎÒÃÇ¿ÉÒÔÓà set variable ÃüÁîÐÞ¸Ä string µÄȡֵ£»
8£®È»ºó¼ÌÐøÔËÐУ¬½«¿´µ½ÕýÈ·µÄ³ÌÐòÔËÐнá¹û¡£

[Ŀ¼]


gcc³£ÓÃÑ¡Ïî¶Ô´úÂëµÄÓ°Ïì

by alert7
2001-12-21
²âÊÔ»·¾³ redhat 6.2

¡ï ǰÑÔ
    ±¾ÎÄÌÖÂÛgccµÄһЩ³£ÓñàÒëÑ¡Ïî¶Ô´úÂëµÄÓ°Ïì¡£µ±È»´úÂë±äÁË£¬ËüµÄÄÚ´æ²¼¾ÖÒ²¾Í»á±äÁË£¬ËæÖ®exploitÒ²¾ÍÒª×öÏàÓ¦µÄ±ä¶¯¡£
gccµÄ±àÒëÑ¡ÏîʵÔÚÌ«¶à£¬±¾ÎļìÁ˼¸¸ö×î³£ÓõÄÑ¡Ïî¡£

¡ï ÑÝʾ³ÌÐò
[alert7@redhat62 alert7]$ cat > test.c
#include
void hi(void)
{
printf("hi");
}
int main(int argc, char *argv[])
{
        hi();
        return 0;
}

[Ŀ¼]


Ò»°ãÇé¿ö

¡ï Ò»°ãÇé¿ö
[alert7@redhat62 alert7]$ gcc -o test test.c
[alert7@redhat62 alert7]$ wc -c test
  11773 test
[alert7@redhat62 alert7]$ gdb -q test
(gdb) disass main
Dump of assembler code for function main:
0x80483e4 :       push   %ebp
0x80483e5 :     mov    %esp,%ebp
0x80483e7 :     call   0x80483d0
0x80483ec :     xor    %eax,%eax
0x80483ee :    jmp    0x80483f0
0x80483f0 :    leave
0x80483f1 :    ret
....
End of assembler dump.
(gdb) disass hi
Dump of assembler code for function hi:
0x80483d0 :        push   %ebp
0x80483d1 :       mov    %esp,%ebp
0x80483d3 :       push   $0x8048450
0x80483d8 :       call   0x8048308
0x80483dd :      add    $0x4,%esp
0x80483e0 :      leave
0x80483e1 :      ret
0x80483e2 :      mov    %esi,%esi
End of assembler dump.
À´¿´¿´²¿·ÖµÄÄÚ´æÓ³Ïó
                   (ÄÚ´æ¸ßÖ·)
                              +--------+
                              |bffffbc4| argvµÄµØÖ·(¼´argv[0]µÄµØÖ·)
                   0xbffffb84 +--------+
                              |00000001| argcµÄÖµ
                   0xbffffb80 +--------+
                              |400309cb|mainµÄ·µ»ØµØÖ·
                   0xbffffb7c +--------+ <-- µ÷ÓÃmainº¯ÊýǰµÄesp
                              |bffffb98| µ÷ÓÃmainº¯ÊýǰµÄebp
                   0xbffffb78 +--------+ <-- mainº¯ÊýµÄebp
                              |080483ec| hi()µÄ·µ»ØµØÖ·
                   0xbffffb74 +--------+
                              |bffffb78| µ÷ÓÃhi()ǰµÄesp
                   0xbffffb70 +--------+
                              |08048450| "hi"µÄµØÖ·
                   0xbffffb6c +--------+
                              | ...... |
                   (ÄÚ´æµÍÖ·)
leave    Ö¸ÁîËù×öµÄ²Ù×÷Ï൱ÓÚMOV ESP,EBP È»ºó POP EBP
ret    Ö¸ÁîËù×öµÄ²Ù×÷Ï൱ÓÚPOP EIP

[Ŀ¼]


-O ±àÒëÑ¡Ïî

¡ï -O ±àÒëÑ¡Ïî
With `-O', the compiler tries to reduce code size and execution time.
When you specify `-O', the two options `-fthread-jumps' and
`-fdefer-pop' are turned  on
ÓÅ»¯£¬¼õÉÙ´úÂë´óСºÍÖ´ÐеÄʱ¼ä
[alert7@redhat62 alert7]$ gcc -O -o test test.c
[alert7@redhat62 alert7]$ wc -c test
  11757 test
[alert7@redhat62 alert7]$ gdb -q test
(gdb) disass main
Dump of assembler code for function main:
0x80483d8 :       push   %ebp
0x80483d9 :     mov    %esp,%ebp
0x80483db :     call   0x80483c8
0x80483e0 :     xor    %eax,%eax
0x80483e2 :    leave
0x80483e3 :    ret
0x80483e4 :    nop
...
End of assembler dump.
(gdb) disass hi
Dump of assembler code for function hi:
0x80483c8 :        push   %ebp
0x80483c9 :       mov    %esp,%ebp
0x80483cb :       push   $0x8048440
0x80483d0 :       call   0x8048308
0x80483d5 :      leave
0x80483d6 :      ret
0x80483d7 :      nop
End of assembler dump.

    ÔÚmain()ÖУ¬°ÑÒ»ÌõjmpÖ¸ÁîÓÅ»¯µôÁË£¬ºÜÏÔÈ»£¬ÕâÌõÖ¸ÁîÊÇ¿ÉÒÔ²»ÐèÒªµÄ¡£
    ÔÚhi()ÖУ¬°Ñadd $0x4,%espÓÅ»¯µôÁË£¬Õâ»á²»»áʹstack²»Æ½ºâÄØ£¿

    À´¿´¿´²¿·ÖµÄÄÚ´æÓ³Ïó

                   (ÄÚ´æ¸ßÖ·)
                              +--------+
                              |bffffbc4| argvµÄµØÖ·(¼´argv[0]µÄµØÖ·)
                   0xbffffb84 +--------+
                              |00000001| argcµÄÖµ
                   0xbffffb80 +--------+
                              |400309cb|mainµÄ·µ»ØµØÖ·
                   0xbffffb7c +--------+ <-- µ÷ÓÃmainº¯ÊýǰµÄesp
                              |bffffb98| µ÷ÓÃmainº¯ÊýǰµÄebp
                   0xbffffb78 +--------+ <-- mainº¯ÊýµÄebp
                              |080483e0| hi()µÄ·µ»ØµØÖ·
                   0xbffffb74 +--------+
                              |bffffb78| µ÷ÓÃhi()ǰµÄesp
                   0xbffffb70 +--------+
                              |08048440| "hi"µÄµØÖ·
                   0xbffffb6c +--------+
                              | ...... |
                   (ÄÚ´æµÍÖ·)
    leaveÖ¸ÁîËù×öµÄ²Ù×÷Ï൱ÓÚ°ÑMOV ESP,EBP È»ºó POP EBP¡£¿´µ½leaveÖ¸Áî²Ù×÷ÁËûÓУ¬ÏȰÑebp-->esp£¬ÔÙpop ebp£¬ÕâÑù¼´Ê¹ÔÚ¹ý³ÌÄÚ¶ÑÕ»µÄesp,ebpÊDz»Æ½ºâµÄ£¬µ«Ö»Òª·µ»ØÊ±ºòÅöµ½leaveÖ¸Áî¾Í»áƽºâÁË£¬ËùÒÔ°Ñadd $0x4,%espÓÅ»¯µôÒ²ÊÇûÓÐÎÊÌâµÄ¡£


[Ŀ¼]


-O2 ±àÒëÑ¡Ïî

¡ï -O2 ±àÒëÑ¡Ïî
-O2
    Optimize  even more.  Nearly all supported optimizations that do
    not involve a space-speed tradeoff are performed.  Loop unrolling
    and function inlining are not done, for example.  As compared to -O,
    this option increases both compilation time and the performance of
    the generated code.
[alert7@redhat62 alert7]$ gcc -O2 -o test test.c
[alert7@redhat62 alert7]$ wc -c test
  11757 test
[alert7@redhat62 alert7]$ gdb -q test
(gdb) disass main
Dump of assembler code for function main:
0x80483d8 :       push   %ebp
0x80483d9 :     mov    %esp,%ebp
0x80483db :     call   0x80483c8
0x80483e0 :     xor    %eax,%eax
0x80483e2 :    leave
0x80483e3 :    ret
...
0x80483ef :    nop
End of assembler dump.
(gdb) disass hi
Dump of assembler code for function hi:
0x80483c8 :        push   %ebp
0x80483c9 :       mov    %esp,%ebp
0x80483cb :       push   $0x8048440
0x80483d0 :       call   0x8048308
0x80483d5 :      leave
0x80483d6 :      ret
0x80483d7 :      nop
End of assembler dump.
ÓÉÓÚ³ÌÐò±È½Ï¼òµ¥£¬ÔÙÓÅ»¯Ò²Ã»ÓкÃÓÅ»¯µÄÁË£¬ËùÒÔ¸ú-O³öÀ´µÄÒ»Ñù¡£


[Ŀ¼]


-fomit-frame-pointer ±àÒëÑ¡Ïî

¡ï -fomit-frame-pointer ±àÒëÑ¡Ïî
-fomit-frame-pointer
              Don't keep the frame pointer in a register for functions
          that don't need one.  This avoids the  instructions to save,
          set up and restore frame pointers; it also makes an extra
          register available in many functions.  It also makes
          debugging impossible on most machines.

    ºöÂÔÖ¡Ö¸Õë¡£ÕâÑùÔÚ³ÌÐò¾Í²»ÐèÒª±£´æ£¬°²×°£¬ºÍ»Ö¸´ebpÁË¡£ÕâÑùebpÒ²¾ÍÊÇÒ»¸öfreeµÄregisterÁË£¬ÔÚº¯ÊýÖоͿÉÒÔËæ±ãʹÓÃÁË¡£

[alert7@redhat62 alert7]$ gcc -fomit-frame-pointer -o test test.c
[alert7@redhat62 alert7]$ wc -c test
  11773 test
[alert7@redhat62 alert7]$ gdb -q test
(gdb) disass main
Dump of assembler code for function main:
0x80483e0 :       call   0x80483d0
0x80483e5 :     xor    %eax,%eax
0x80483e7 :     jmp    0x80483f0
0x80483e9 :     lea    0x0(%esi,1),%esi
0x80483f0 :    ret
....
End of assembler dump.
(gdb) disass hi
Dump of assembler code for function hi:
0x80483d0 :        push   $0x8048450
0x80483d5 :       call   0x8048308
0x80483da :      add    $0x4,%esp
0x80483dd :      ret
0x80483de :      mov    %esi,%esi
End of assembler dump.
ÔÚmain()ºÍhi()Öж¼È¥µôÁËÒÔÏÂÖ¸Áî
push   %ebp
mov    %esp,%ebp//ÕâÁ½ÌõÖ¸Áî°²×°
leave//ÕâÌõÖ¸Áî»Ö¸´
À´¿´¿´²¿·ÖµÄÄÚ´æÓ³Ïó
                   (ÄÚ´æ¸ßÖ·)
                              +--------+
                              |bffffbc4| argvµÄµØÖ·(¼´argv[0]µÄµØÖ·)
                   0xbffffb84 +--------+
                              |00000001| argcµÄÖµ
                   0xbffffb80 +--------+
                              |400309cb|mainµÄ·µ»ØµØÖ·
                   0xbffffb7c +--------+
                              |080483e5| hi()µÄ·µ»ØµØÖ·
                   0xbffffb78 +--------+
                              |08048450|  "hi"×Ö·û´®µÄµØÖ·
                   0xbffffb74 +--------+
                              | ...... |
                   (ÄÚ´æµÍÖ·)
ûÓб£´æÉϲãÖ´Ðл·¾³µÄebp.

[Ŀ¼]


-fomit-frame-pointer && -O2

¡ï -fomit-frame-pointer && -O2
-fomit-frame-pointer±àÒëÑ¡ÏîÈ¥µôÁË
push   %ebp
mov    %esp,%ebp//ÕâÁ½ÌõÖ¸Áî°²×°
leave//ÕâÌõÖ¸Áî»Ö¸´
-O2±àÒëÑ¡ÏîÈ¥µôÁË
add    $0x4,%esp
Á½¸ö¼ÓÆðÀ´»á²»»áÕâËÄÌõÖ¸ÁîÒ»ÆðÈ¥µô£¬´Ó¶øÊ¹stack²»Æ½ºâÄØ£¿
[alert7@redhat62 alert7]$ gcc -fomit-frame-pointer -O2 -o test test.c
[alert7@redhat62 alert7]$ wc -c test
  11741 test
[alert7@redhat62 alert7]$ gdb -q test
(gdb) disass main
Dump of assembler code for function main:
0x80483d8 :       call   0x80483c8
0x80483dd :     xor    %eax,%eax
0x80483df :     ret
End of assembler dump.
(gdb) disass hi
Dump of assembler code for function hi:
0x80483c8 :        push   $0x8048430
0x80483cd :       call   0x8048308
0x80483d2 :      add    $0x4,%esp
0x80483d5 :      ret
0x80483d6 :      mov    %esi,%esi
End of assembler dump.
À´¿´¿´²¿·ÖµÄÄÚ´æÓ³Ïó
                   (ÄÚ´æ¸ßÖ·)
                              +--------+
                              |bffffbc4| argvµÄµØÖ·(¼´argv[0]µÄµØÖ·)
                   0xbffffb84 +--------+
                              |00000001| argcµÄÖµ
                   0xbffffb80 +--------+
                              |400309cb|mainµÄ·µ»ØµØÖ·
                   0xbffffb7c +--------+
                              |080483dd| hi()µÄ·µ»ØµØÖ·
                   0xbffffb78 +--------+
                              |08048430|  "hi"×Ö·û´®µÄµØÖ·
                   0xbffffb74 +--------+
                              | ...... |
                   (ÄÚ´æµÍÖ·)
´Ëʱ¾ÍûÓаÑadd    $0x4,%espÓÅ»¯µô£¬Èç¹ûÓÅ»¯µôµÄ»°£¬Õû¸östack¾Í
»á±äµÄ²»Æ½ºâ£¬´Ó¶ø»áµ¼Ö³ÌÐò³ö´í¡£

[Ŀ¼]


-fPIC ±àÒëÑ¡Ïî

¡ï -fPIC ±àÒëÑ¡Ïî
-fPIC    If  supported for the target machine, emit position-independent
    code, suitable for dynamic linking,even if branches need large
    displacements.

    ²úÉúλÖÃÎ޹شúÂ루PIC£©£¬Ò»°ã´´½¨¹²Ïí¿âʱÓõ½¡£
    ÔÚx86ÉÏ£¬PICµÄ´úÂëµÄ·ûºÅÒýÓö¼ÊÇͨ¹ýebx½øÐвÙ×÷µÄ¡£

[alert7@redhat62 alert7]$ gcc -fPIC -o test test.c
[alert7@redhat62 alert7]$ wc -c test
  11805 test
[alert7@redhat62 alert7]$ gdb -q test
(gdb) disass main
Dump of assembler code for function main:
0x80483f8 :       push   %ebp
0x80483f9 :     mov    %esp,%ebp
0x80483fb :     push   %ebx
0x80483fc :     call   0x8048401
0x8048401 :     pop    %ebx//È¡µÃ¸ÃÖ¸ÁîµÄµØÖ·
0x8048402 :    add    $0x1093,%ebx//´ËʱebxÀïÃæ´æ·Å×ÅÊÇGOT±íµÄµØÖ·
0x8048408 :    call   0x80483d0
0x804840d :    xor    %eax,%eax
0x804840f :    jmp    0x8048411
0x8048411 :    mov    0xfffffffc(%ebp),%ebx
0x8048414 :    leave
0x8048415 :    ret
...
End of assembler dump.
(gdb) disass hi
Dump of assembler code for function hi:
0x80483d0 :        push   %ebp
0x80483d1 :       mov    %esp,%ebp
0x80483d3 :       push   %ebx
0x80483d4 :       call   0x80483d9
0x80483d9 :       pop    %ebx
0x80483da :      add    $0x10bb,%ebx
0x80483e0 :      lea    0xffffefdc(%ebx),%edx
0x80483e6 :      mov    %edx,%eax
0x80483e8 :      push   %eax
0x80483e9 :      call   0x8048308
0x80483ee :      add    $0x4,%esp
0x80483f1 :      mov    0xfffffffc(%ebp),%ebx
0x80483f4 :      leave
0x80483f5 :      ret
0x80483f6 :      mov    %esi,%esi
End of assembler dump.
À´¿´¿´²¿·ÖµÄÄÚ´æÓ³Ïó

    (ÄÚ´æ¸ßÖ·)
              +--------+
              |bffffbc4| argvµÄµØÖ·(¼´argv[0]µÄµØÖ·)
   0xbffffb84 +--------+
              |00000001| argcµÄÖµ
   0xbffffb80 +--------+
              |400309cb|mainµÄ·µ»ØµØÖ·
   0xbffffb7c +--------+ <-- µ÷ÓÃmainº¯ÊýǰµÄesp
              |bffffb98| µ÷ÓÃmainº¯ÊýǰµÄebp
   0xbffffb78 +--------+ <-- mainº¯ÊýµÄebp
              |401081ec| ±£´æµÄebx
   0xbffffb74 +--------+
              |0804840d| £¨´æ·Å¹ýcall 0x8048401µÄÏÂÒ»ÌõÖ¸ÁîµØÖ·£©
   0xbffffb70 +--------+
              |bffffb78| µ÷ÓÃhi()ǰµÄesp
   0xbffffb6c +--------+
              |08049494| GOT±íµØÖ·
   0xbffffb68 +--------+
              |08048470|£¨´æ·Å¹ýcall 0x80483d9µÄÏÂÒ»ÌõÖ¸ÁîµØÖ·£©
   0xbffffb64 +--------+
              | ...... |
     (ÄÚ´æµÍÖ·)

[Ŀ¼]


-static ±àÒëÑ¡Ïî

¡ï -static ±àÒëÑ¡Ïî
-static
    On systems that support dynamic linking, this prevents
    linking with the shared libraries.  On other  systems,
    this option has no effect.
°ÑһЩº¯Êý¶¼¾²Ì¬µÄ±àÒëµ½³ÌÐòÖУ¬¶øÎÞÐ趯̬Á´½ÓÁË¡£
[alert7@redhat62 alert7]$ gcc -o test -static test.c
[alert7@redhat62 alert7]$ wc -c test
962808 test
[alert7@redhat62 alert7]$ gdb -q test
(gdb) disass main
Dump of assembler code for function main:
0x80481b4 :       push   %ebp
0x80481b5 :     mov    %esp,%ebp
0x80481b7 :     call   0x80481a0
0x80481bc :     xor    %eax,%eax
0x80481be :    jmp    0x80481c0
0x80481c0 :    leave
0x80481c1 :    ret
...
End of assembler dump.
(gdb) disass hi
Dump of assembler code for function hi:
0x80481a0 :        push   %ebp
0x80481a1 :       mov    %esp,%ebp
0x80481a3 :       push   $0x8071528
0x80481a8 :       call   0x804865c
0x80481ad :      add    $0x4,%esp
0x80481b0 :      leave
0x80481b1 :      ret
0x80481b2 :      mov    %esi,%esi
End of assembler dump.
[alert7@redhat62 alert7]$ ldd test

        not a dynamic executable
-static³öÀ´µÄ´úÂëÒѾ­Ã»ÓÐPLTÁË£¬GOTËäÈ»ÓУ¬ÒѾ­È«²¿Îª0ÁË¡£

[Ŀ¼]


AT&TµÄ»ã±à¸ñʽ

Ò»¡¡»ù±¾Óï·¨

Óï·¨ÉÏÖ÷ÒªÓÐÒÔϼ¸¸ö²»Í¬.

¡ï ¼Ä´æÆ÷ÃüÃûÔ­Ôò

AT&T: %eax Intel: eax

¡ïÔ´/Ä¿µÄ²Ù×÷Êý˳Ðò

AT&T: movl %eax,%ebx Intel: mov ebx,eax

¡ï³£Êý/Á¢¼´ÊýµÄ¸ñʽ

AT&T: movl $_value,%ebx Intel: mov eax,_value
°Ñ_valueµÄµØÖ··ÅÈëeax¼Ä´æÆ÷

AT&T: movl $0xd00d,%ebx Intel: mov ebx,0xd00d

¡ï ²Ù×÷Êý³¤¶È±êʶ

AT&T: movw %ax,%bx Intel: mov bx,ax

¡ïѰַ·½Ê½

AT&T: immed32(basepointer,indexpointer,indexscale)
Intel: [basepointer + indexpointer*indexscale + imm32)

Linux¹¤×÷ÓÚ±£»¤Ä£Ê½Ï£¬ÓõÄÊÇ£³£²Î»ÏßÐÔµØÖ·£¬ËùÒÔÔÚ¼ÆËãµØÖ·Ê±²»Óÿ¼ÂÇsegment:offsetµÄÎÊÌ⣮ÉÏʽÖеĵØÖ·Ó¦Îª£º
imm32 + basepointer + indexpointer*indexscale

ÏÂÃæÊÇһЩÀý×Ó£º

¡ïÖ±½ÓѰַ

AT&T: _booga¡¡; _boogaÊÇÒ»¸öÈ«¾ÖµÄC±äÁ¿

×¢Òâ¼ÓÉÏ$ÊDZíʾµØÖ·ÒýÓ㬲»¼ÓÊDZíʾֵÒýÓã®
×¢£º¶ÔÓÚ¾Ö²¿±äÁ¿£¬¿ÉÒÔͨ¹ý¶ÑÕ»Ö¸ÕëÒýÓã®

Intel: [_booga]

¡ï¼Ä´æÆ÷¼ä½ÓѰַ

AT&T: (%eax)
Intel: [eax]

¡ï±äַѰַ

AT&T: _variable(%eax)
Intel: [eax + _variable]

AT&T: _array(,%eax,4)
Intel: [eax*4 + _array]

AT&T: _array(%ebx,%eax,8)
Intel: [ebx + eax*8 + _array]

¶þ¡¡»ù±¾µÄÐÐÄÚ»ã±à

    ·»ù±¾µÄÐÐÄÚ»ã±àºÜ¼òµ¥£¬Ò»°ãÊǰ´ÕÕÏÂÃæµÄ¸ñʽ:
        asm("statements");
ÀýÈ磺asm("nop"); asm("cli");

    ·asm¡¡ºÍ¡¡__asm__ÊÇÍêȫһÑùµÄ£®

    ·Èç¹ûÓжàÐлã±à£¬ÔòÿһÐж¼Òª¼ÓÉÏ¡¡"\n\t"
ÀýÈ磺

asm( "pushl %eax\n\t"
"movl $0,%eax\n\t"
"popl %eax");

    ʵ¼ÊÉÏgccÔÚ´¦Àí»ã±àʱ£¬ÊÇÒª°Ñasm(...)µÄÄÚÈÝ"´òÓ¡"µ½»ã±àÎļþÖУ¬ËùÒÔ¸ñʽ¿ØÖÆ×Ö·ûÊDZØÒªµÄ£®

ÔÙÀýÈ磺
asm("movl %eax,%ebx");
asm("xorl %ebx,%edx");
asm("movl $0,_booga);

    ÔÚÉÏÃæµÄÀý×ÓÖУ¬ÓÉÓÚÎÒÃÇÔÚÐÐÄÚ»ã±àÖиıäÁËedxºÍebxµÄÖµ£¬µ«ÊÇÓÉÓÚgccµÄÌØÊâµÄ´¦Àí·½·¨£¬¼´ÏÈÐγɻã±àÎļþ£¬ÔÙ½»¸øGASÈ¥»ã±à£¬ËùÒÔGAS²¢²»ÖªµÀÎÒÃÇÒѾ­¸Ä±äÁËedxºÍebxµÄÖµ£¬Èç¹û³ÌÐòµÄÉÏÏÂÎÄÐèÒªedx»òebx×÷Ôݴ棬ÕâÑù¾Í»áÒýÆðÑÏÖØµÄºó¹û£®¶ÔÓÚ±äÁ¿_boogaÒ²´æÔÚÒ»ÑùµÄÎÊÌ⣮ΪÁ˽â¾öÕâ¸öÎÊÌ⣬¾ÍÒªÓõ½À©Õ¹µÄÐÐÄÚ»ã±àÓï·¨£®

Èý¡¡À©Õ¹µÄÐÐÄÚ»ã±à

    À©Õ¹µÄÐÐÄÚ»ã±àÀàËÆÓÚWatcom.

    »ù±¾µÄ¸ñʽÊÇ£º
asm ( "statements" : output_regs : input_regs : clobbered_regs);
clobbered_regsÖ¸µÄÊDZ»¸Ä±äµÄ¼Ä´æÆ÷£®

ÏÂÃæÊÇÒ»¸öÀý×Ó(Ϊ·½±ãÆð¼û£¬ÎÒʹÓÃÈ«¾Ö±äÁ¿£©£º

int count=1;
int value=1;
int buf[10];
void main()
{
asm(
"cld \n\t"
"rep \n\t"
"stosl"
:
: "c" (count), "a" (value) , "D" (buf[0])
: "%ecx","%edi" );
}

µÃµ½µÄÖ÷Òª»ã±à´úÂëΪ£º

movl count,%ecx
movl value,%eax
movl buf,%edi
#APP
cld
rep
stosl
#NO_APP

    cld,rep,stos¾Í²»Óöà½âÊÍÁË£®Õ⼸ÌõÓï¾äµÄ¹¦ÄÜÊÇÏòbufÖÐдÉÏcount¸övalueÖµ£®Ã°ºÅºóµÄÓï¾äÖ¸Ã÷ÊäÈ룬Êä³öºÍ±»¸Ä±äµÄ¼Ä´æÆ÷£®Í¨¹ýðºÅÒÔºóµÄÓï¾ä£¬±àÒëÆ÷¾ÍÖªµÀÄãµÄÖ¸ÁîÐèÒªºÍ¸Ä±äÄÄЩ¼Ä´æÆ÷£¬´Ó¶ø¿ÉÒÔÓÅ»¯¼Ä´æÆ÷µÄ·ÖÅ䣮
    ÆäÖзûºÅ"c"(count)ָʾҪ°ÑcountµÄÖµ·ÅÈëecx¼Ä´æÆ÷

ÀàËÆµÄ»¹ÓУº

a eax
b ebx
c ecx
d edx
S esi
D edi
I ³£ÊýÖµ£¬(0 - 31)
q,r ¶¯Ì¬·ÖÅäµÄ¼Ä´æÆ÷
g eax,ebx,ecx,edx»òÄÚ´æ±äÁ¿
A °ÑeaxºÍedxºÏ³ÉÒ»¸ö64λµÄ¼Ä´æÆ÷(use long longs)

ÎÒÃÇÒ²¿ÉÒÔÈÃgcc×Ô¼ºÑ¡ÔñºÏÊʵļĴæÆ÷£®
ÈçÏÂÃæµÄÀý×Ó£º
asm("leal (%1,%1,4),%0"
: "=r" (x)
: "0" (x) );

Õâ¶Î´úÂëʵÏÖ5*xµÄ¿ìËٳ˷¨£®
µÃµ½µÄÖ÷Òª»ã±à´úÂëΪ£º
movl x,%eax
#APP
leal (%eax,%eax,4),%eax
#NO_APP
movl %eax,x

¼¸µã˵Ã÷£º

1.ʹÓÃqָʾ±àÒëÆ÷´Óeax,ebx,ecx,edx·ÖÅä¼Ä´æÆ÷£®Ê¹ÓÃrָʾ±àÒëÆ÷´Óeax,ebx,ecx,edx,esi,edi·ÖÅä¼Ä´æÆ÷£®

2.ÎÒÃDz»±Ø°Ñ±àÒëÆ÷·ÖÅäµÄ¼Ä´æÆ÷·ÅÈë¸Ä±äµÄ¼Ä´æÆ÷ÁÐ±í£¬ÒòΪ¼Ä´æÆ÷ÒѾ­¼ÇסÁËËüÃÇ£®

3."="ÊDZêʾÊä³ö¼Ä´æÆ÷£¬±ØÐëÕâÑùÓã®

4.Êý×Ö%nµÄÓ÷¨£º

    Êý×Ö±íʾµÄ¼Ä´æÆ÷Êǰ´ÕÕ³öÏֺʹÓ×óµ½ÓÒµÄ˳ÐòÓ³Éäµ½ÓÃ"r"»ò"q"ÇëÇóµÄ¼Ä´æÆ÷£®Èç¹ûÎÒÃÇÒªÖØÓÃ"r"»ò"q"ÇëÇóµÄ¼Ä´æÆ÷µÄ»°£¬¾Í¿ÉÒÔʹÓÃËüÃÇ£®

5.Èç¹ûÇ¿ÖÆÊ¹Óù̶¨µÄ¼Ä´æÆ÷µÄ»°£¬Èç²»ÓÃ%1,¶øÓÃebx,Ôòasm("leal (%%ebx,%%ebx,4),%0"

: "=r" (x)
: "0" (x) );

×¢ÒâҪʹÓÃÁ½¸ö%,ÒòΪһ¸ö%µÄÓï·¨ÒѾ­±»%nÓõôÁË£®

ÏÂÃæ¿ÉÒÔÀ´½âÊÍletter 4854-4855µÄÎÊÌ⣺


1¡¢±äÁ¿¼ÓÏ»®ÏߺÍ˫ϻ®ÏßÓÐÊ²Ã´ÌØÊ⺬ÒåÂð£¿
    ¼ÓÏ»®ÏßÊÇָȫ¾Ö±äÁ¿£¬µ«ÎÒµÄgccÖмӲ»¼Ó¶¼ÎÞËùν£®

2¡¢ÒÔÉ϶¨ÒåÓÃÈçϵ÷ÓÃʱչ¿ª»áÊÇʲôÒâ˼£¿
#define _syscall1(type,name,type1,arg1) \
type name(type1 arg1) \
{ \
long __res; \
/* __resÓ¦¸ÃÊÇÒ»¸öÈ«¾Ö±äÁ¿¡¡*/
__asm__ volatile ("int $0x80" \
/* volatile µÄÒâ˼ÊDz»ÔÊÐíÓÅ»¯£¬Ê¹±àÒëÆ÷Ñϸñ°´ÕÕÄãµÄ»ã±à´úÂë»ã±à*/
: "=a" (__res) \
/* ²úÉú´úÂë¡¡movl %eax, __res */
: "0" (__NR_##name),"b" ((long)(arg1))); \
/* Èç¹ûÎÒû¼Ç´íµÄ»°£¬ÕâÀï##Ö¸µÄÊÇÁ½´ÎºêÕ¹¿ª£®
¡¡¡¡¼´ÓÃʵ¼ÊµÄϵͳµ÷ÓÃÃû×Ö´úÌæ"name",È»ºóÔÙ°Ñ__NR_...Õ¹¿ª£®
¡¡¡¡½Ó×ŰÑÕ¹¿ªµÄ³£Êý·ÅÈëeax£¬°Ñarg1·ÅÈëebx */
if (__res >= 0) \
return (type) __res; \
errno = -__res; \
return -1; \
}

[Ŀ¼]


x86ÄÚÁª»ã±à

    ±¾ÎÄÌṩÁËÔÚ Linux ƽ̨ÉÏʹÓú͹¹Ôì x86 ÄÚÁª»ã±àµÄ¸ÅÀ¨ÐÔ½éÉÜ¡£Ëû½éÉÜÁËÄÚÁª»ã±à¼°Æä¸÷ÖÖÓ÷¨µÄ»ù´¡ÖªÊ¶£¬ÌṩÁËһЩ»ù±¾µÄÄÚÁª»ã±à±àÂëÖ¸µ¼£¬²¢½âÊÍÁËÔÚ Linux ÄÚºËÖÐÄÚÁª»ã±à´úÂëµÄһЩʵÀý¡£
    Èç¹ûÄúÊÇ Linux Äں˵Ŀª·¢ÈËÔ±£¬Äú»á·¢ÏÖ×Ô¼º¾­³£Òª¶ÔÓëÌåϵ½á¹¹¸ß¶ÈÏà¹ØµÄ¹¦ÄܽøÐбàÂë»òÓÅ»¯´úÂë·¾¶¡£ÄúºÜ¿ÉÄÜÊÇͨ¹ý½«»ã±àÓïÑÔÖ¸Áî²åÈëµ½ C Óï¾äµÄÖм䣨ÓÖ³ÆÎªÄÚÁª»ã±àµÄÒ»ÖÖ·½·¨£©À´Ö´ÐÐÕâЩÈÎÎñµÄ¡£ÈÃÎÒÃÇ¿´Ò»Ï Linux ÖÐÄÚÁª»ã±àµÄÌØ¶¨Ó÷¨¡££¨ÎÒÃǽ«ÌÖÂÛÏÞÖÆÔÚ IA32 »ã±à¡££©
[Ŀ¼]


¼òÊö

GNU »ã±à³ÌÐò¼òÊö
    ÈÃÎÒÃÇÊ×ÏÈ¿´Ò»Ï Linux ÖÐʹÓõĻù±¾»ã±à³ÌÐòÓï·¨¡£GCC£¨ÓÃÓÚ Linux µÄ GNU C ±àÒëÆ÷£©Ê¹Óà AT&T »ã±àÓï·¨¡£ÏÂÃæÁгöÁËÕâÖÖÓï·¨µÄһЩ»ù±¾¹æÔò¡££¨¸ÃÁбí¿Ï¶¨²»ÍêÕû£»Ö»°üÀ¨ÁËÓëÄÚÁª»ã±àÏà¹ØµÄÄÇЩ¹æÔò¡££©

¼Ä´æÆ÷ÃüÃû
    ¼Ä´æÆ÷Ãû³ÆÓÐ % ǰ׺¡£¼´£¬Èç¹û±ØÐëʹÓà eax£¬ËüÓ¦¸ÃÓÃ×÷ %eax¡£

Ô´²Ù×÷ÊýºÍÄ¿µÄ²Ù×÷ÊýµÄ˳Ðò
    ÔÚËùÓÐÖ¸ÁîÖУ¬ÏÈÊÇÔ´²Ù×÷Êý£¬È»ºó²ÅÊÇÄ¿µÄ²Ù×÷Êý¡£ÕâÓ뽫Դ²Ù×÷Êý·ÅÔÚÄ¿µÄ²Ù×÷ÊýÖ®ºóµÄ Intel Óï·¨²»Í¬¡£
    mov %eax, %ebx, transfers the contents of eax to ebx.

²Ù×÷Êý´óС
    ¸ù¾Ý²Ù×÷ÊýÊÇ×Ö½Ú (byte)¡¢×Ö (word) »¹Êdz¤ÐÍ (long)£¬Ö¸ÁîµÄºó׺¿ÉÒÔÊÇ b¡¢w »ò l¡£Õâ²¢²»ÊÇÇ¿ÖÆÐԵģ»GCC »á³¢ÊÔͨ¹ý¶ÁÈ¡²Ù×÷ÊýÀ´ÌṩÏàÓ¦µÄºó׺¡£µ«ÊÖ¹¤Ö¸¶¨ºó׺¿ÉÒÔ¸ÄÉÆ´úÂëµÄ¿É¶ÁÐÔ£¬²¢¿ÉÒÔÏû³ý±àÒëÆ÷²Â²â²»ÕýÈ·µÄ¿ÉÄÜÐÔ¡£

    movb %al, %bl -- Byte move
    movw %ax, %bx -- Word move
    movl %eax, %ebx -- Longword move

Á¢¼´²Ù×÷Êý
    ͨ¹ýʹÓà $ Ö¸¶¨Ö±½Ó²Ù×÷Êý¡£

    movl $0xffff, %eax -- will move the value of 0xffff into eax register.

¼ä½ÓÄÚ´æÒýÓÃ
    ÈκζÔÄÚ´æµÄ¼ä½ÓÒýÓö¼ÊÇͨ¹ýʹÓà ( ) À´Íê³ÉµÄ¡£

    movb (%esi), %al -- will transfer the byte in the memory
    pointed by esi into al register

[Ŀ¼]


ÄÚÁª»ã±à

ÄÚÁª»ã±à
    GCC ΪÄÚÁª»ã±àÌá¹©ÌØÊâ½á¹¹£¬Ëü¾ßÓÐÒÔϸñʽ£º
    asm ( assembler template
        : output operands               (optional)
        : input operands                (optional)
        : list of clobbered registers   (optional)
        );

    ±¾ÀýÖУ¬»ã±à³ÌÐòÄ£°åÓÉ»ã±àÖ¸Áî×é³É¡£ÊäÈë²Ù×÷ÊýÊdz䵱ָÁîÊäÈë²Ù×÷ÊýʹÓÃµÄ C ±í´ïʽ¡£Êä³ö²Ù×÷ÊýÊǽ«¶ÔÆäÖ´Ðлã±àÖ¸ÁîÊä³öµÄ C ±í´ïʽ¡£

    ÄÚÁª»ã±àµÄÖØÒªÐÔÌåÏÖÔÚËüÄܹ»Áé»î²Ù×÷£¬¶øÇÒ¿ÉÒÔʹÆäÊä³öͨ¹ý C ±äÁ¿ÏÔʾ³öÀ´¡£ÒòΪËü¾ßÓÐÕâÖÖÄÜÁ¦£¬ËùÒÔ "asm" ¿ÉÒÔÓÃ×÷»ã±àÖ¸ÁîºÍ°üº¬ËüµÄ C ³ÌÐòÖ®¼äµÄ½Ó¿Ú¡£

    Ò»¸ö·Ç³£»ù±¾µ«ºÜÖØÒªµÄÇø±ðÔÚÓÚ¼òµ¥ÄÚÁª»ã±àÖ»°üÀ¨Ö¸Á¶øÀ©Õ¹ÄÚÁª»ã±à°üÀ¨²Ù×÷Êý¡£ÒªËµÃ÷ÕâÒ»µã£¬¿¼ÂÇÒÔÏÂʾÀý£º

ÄÚÁª»ã±àµÄ»ù±¾ÒªËØ

{
    int a=10, b;
    asm ("movl %1, %%eax;
          movl %%eax, %0;"
          :"=r"(b)  /* output */
          :"r"(a)       /* input */
         :"%eax"); /* clobbered register */
}

    ÔÚÉÏÀýÖУ¬ÎÒÃÇʹÓûã±àÖ¸Áîʹ "b" µÄÖµµÈÓÚ "a"¡£Çë×¢ÒâÒÔϼ¸µã£º
    "b" ÊÇÊä³ö²Ù×÷Êý£¬ÓÉ %0 ÒýÓã¬"a" ÊÇÊäÈë²Ù×÷Êý£¬ÓÉ %1 ÒýÓá£
    "r" ÊDzÙ×÷ÊýµÄÔ¼Êø£¬ËüÖ¸¶¨½«±äÁ¿ "a" ºÍ "b" ´æ´¢ÔڼĴæÆ÷ÖС£Çë×¢Ò⣬Êä³ö²Ù×÷ÊýÔ¼ÊøÓ¦¸Ã´øÓÐÒ»¸öÔ¼ÊøÐÞÊηû "="£¬Ö¸¶¨ËüÊÇÊä³ö²Ù×÷Êý¡£
    ÒªÔÚ "asm" ÄÚʹÓüĴæÆ÷ %eax£¬%eax µÄÇ°ÃæÓ¦¸ÃÔÙ¼ÓÒ»¸ö %£¬»»¾ä»°Ëµ¾ÍÊÇ %%eax£¬ÒòΪ "asm" ʹÓà %0¡¢%1 µÈÀ´±êʶ±äÁ¿¡£ÈκδøÓÐÒ»¸ö % µÄÊý¶¼¿´×÷ÊÇÊäÈ룯Êä³ö²Ù×÷Êý£¬¶ø²»ÈÏΪÊǼĴæÆ÷¡£
µÚÈý¸öðºÅºóµÄÐÞÊμĴæÆ÷ %eax ¸æËß½«ÔÚ "asm" ÖÐÐÞ¸Ä GCC %eax µÄÖµ£¬ÕâÑù GCC ¾Í²»Ê¹ÓøüĴæÆ÷´æ´¢ÈÎºÎÆäËüµÄÖµ¡£
    movl %1, %%eax ½« "a" µÄÖµÒÆµ½ %eax ÖУ¬movl %%eax, %0 ½« %eax µÄÄÚÈÝÒÆµ½ "b" ÖС£
ÒòΪ "b" ±»Ö¸¶¨³ÉÊä³ö²Ù×÷Êý£¬Òò´Ëµ± "asm" µÄÖ´ÐÐÍê³Éºó£¬Ëü½«·´Ó³³ö¸üеÄÖµ¡£»»¾ä»°Ëµ£¬¶Ô "asm" ÄÚ "b" Ëù×öµÄ¸ü¸Ä½«ÔÚ "asm" Íâ·´Ó³³öÀ´¡£


[Ŀ¼]


³ÌÐòÄ£°å

    »ã±à³ÌÐòÄ£°åÊÇÒ»×é²åÈëµ½ C ³ÌÐòÖеĻã±àÖ¸Á¿ÉÒÔÊǵ¥¸öÖ¸ÁҲ¿ÉÒÔÊÇÒ»×éÖ¸Á¡£Ã¿ÌõÖ¸Áî¶¼Ó¦¸ÃÓÉË«ÒýºÅÀ¨Æð£¬»òÕßÕû×éÖ¸ÁîÓ¦¸ÃÓÉË«ÒýºÅÀ¨Æð¡£Ã¿ÌõÖ¸ÁӦ¸ÃÓÃÒ»¸ö¶¨½ç·û½áβ¡£ÓÐЧµÄ¶¨½ç·ûΪÐÂÐÐ (\n) ºÍ·ÖºÅ (;)¡£ '\n' ºó¿ÉÒÔ¸úÒ»¸ö tab(\t) ×÷Ϊ¸ñʽ»¯·ûºÅ£¬Ôö¼Ó GCC ÔÚ»ã±àÎļþÖÐÉú³ÉµÄÖ¸ÁîµÄ¿É¶ÁÐÔ¡£ Ö¸Áîͨ¹ýÊý %0¡¢%1 µÈÀ´ÒýÓà C ±í´ïʽ£¨Ö¸¶¨Îª²Ù×÷Êý£©¡£

    Èç¹ûÏ£ÍûÈ·±£±àÒëÆ÷²»»áÔÚ "asm" ÄÚ²¿ÓÅ»¯Ö¸Á¿ÉÒÔÔÚ "asm" ºóʹÓùؼü×Ö "volatile"¡£Èç¹û³ÌÐò±ØÐëÓë ANSI C ¼æÈÝ£¬ÔòÓ¦¸ÃʹÓà __asm__ ºÍ __volatile__£¬¶ø²»ÊÇ asm ºÍ volatile¡£

[Ŀ¼]


²Ù×÷Êý

   C ±í´ïʽÓÃ×÷ "asm" ÄڵĻã±àÖ¸Áî²Ù×÷Êý¡£ÔÚ»ã±àÖ¸Áîͨ¹ý¶Ô C ³ÌÐòµÄ C ±í´ïʽ½øÐвÙ×÷À´Ö´ÐÐÓÐÒâÒåµÄ×÷ÒµµÄÇé¿öÏ£¬²Ù×÷ÊýÊÇÄÚÁª»ã±àµÄÖ÷ÒªÌØÐÔ¡£

    ÿ¸ö²Ù×÷Êý¶¼ÓɲÙ×÷ÊýÔ¼Êø×Ö·û´®Ö¸¶¨£¬ºóÃæ¸úÓÃÀ¨»¡À¨ÆðµÄ C ±í´ïʽ£¬ÀýÈ磺"constraint" (C expression)¡£²Ù×÷ÊýÔ¼ÊøµÄÖ÷Òª¹¦ÄÜÊÇÈ·¶¨²Ù×÷ÊýµÄѰַ·½Ê½¡£

    ¿ÉÒÔÔÚÊäÈëºÍÊä³ö²¿·ÖÖÐͬʱʹÓöà¸ö²Ù×÷Êý¡£Ã¿¸ö²Ù×÷ÊýÓɶººÅ·Ö¸ô¿ª¡£

    ÔÚ»ã±à³ÌÐòÄ£°åÄÚ²¿£¬²Ù×÷ÊýÓÉÊý×ÖÒýÓá£Èç¹û×ܹ²ÓÐ n ¸ö²Ù×÷Êý£¨°üÀ¨ÊäÈëºÍÊä³ö£©£¬ÄÇôµÚÒ»¸öÊä³ö²Ù×÷ÊýµÄ±àºÅΪ 0£¬ÖðÏîµÝÔö£¬×îºóÄǸöÊäÈë²Ù×÷ÊýµÄ±àºÅΪ n-1¡£×ܲÙ×÷ÊýµÄÊýÄ¿ÏÞÖÆÔÚ 10£¬Èç¹û»úÆ÷ÃèÊöÖÐÈκÎÖ¸ÁîģʽÖеÄ×î´ó²Ù×÷ÊýÊýÄ¿´óÓÚ 10£¬ÔòʹÓúóÕß×÷ΪÏÞÖÆ¡£

[Ŀ¼]


ÐÞÊμĴæÆ÷Áбí

    Èç¹û "asm" ÖеÄÖ¸ÁîÖ¸µÄÊÇÓ²¼þ¼Ä´æÆ÷£¬¿ÉÒÔ¸æËß GCC ÎÒÃǽ«×Ô¼ºÊ¹ÓúÍÐÞ¸ÄËüÃÇ¡£ÕâÑù£¬GCC ¾Í²»»á¼ÙÉèËü×°Èëµ½ÕâЩ¼Ä´æÆ÷ÖеÄÖµÊÇÓÐЧֵ¡£Í¨³£²»ÐèÒª½«ÊäÈëºÍÊä³ö¼Ä´æÆ÷ÁÐΪ clobbered£¬ÒòΪ GCC ÖªµÀ "asm" ʹÓÃËüÃÇ£¨ÒòΪËüÃDZ»Ã÷È·Ö¸¶¨ÎªÔ¼Êø£©¡£²»¹ý£¬Èç¹ûÖ¸ÁîʹÓÃÈÎºÎÆäËüµÄ¼Ä´æÆ÷£¬ÎÞÂÛÊÇÃ÷È·µÄ»¹ÊÇÒþº¬µÄ£¨¼Ä´æÆ÷²»ÔÚÊäÈëÔ¼ÊøÁбíÖгöÏÖ£¬Ò²²»ÔÚÊä³öÔ¼ÊøÁбíÖгöÏÖ£©£¬¼Ä´æÆ÷¶¼±ØÐë±»Ö¸¶¨ÎªÐÞÊÎÁÐ±í¡£ÐÞÊμĴæÆ÷ÁÐÔÚµÚÈý¸öðºÅÖ®ºó£¬ÆäÃû³Æ±»Ö¸¶¨Îª×Ö·û´®¡£

    ÖÁÓڹؼü×Ö£¬Èç¹ûÖ¸ÁîÒÔijЩ²»¿ÉÔ¤ÖªÇÒ²»Ã÷È·µÄ·½Ê½ÐÞ¸ÄÁËÄڴ棬Ôò¿ÉÄܽ« "memory" ¹Ø¼ü×ÖÌí¼Óµ½ÐÞÊμĴæÆ÷ÁбíÖС£ÕâÑù¾Í¸æËß GCC ²»ÒªÔÚ²»Í¬Ö¸ÁîÖ®¼ä½«ÄÚ´æÖµ¸ßËÙ»º´æÔڼĴæÆ÷ÖС£

[Ŀ¼]


²Ù×÷ÊýÔ¼Êø

    Ç°ÃæÌáµ½¹ý£¬"asm" ÖеÄÿ¸ö²Ù×÷Êý¶¼Ó¦¸ÃÓɲÙ×÷ÊýÔ¼Êø×Ö·û´®ÃèÊö£¬ºóÃæ¸úÓÃÀ¨»¡À¨ÆðµÄ C ±í´ïʽ¡£²Ù×÷ÊýÔ¼ÊøÖ÷ÒªÊÇÈ·¶¨Ö¸ÁîÖвÙ×÷ÊýµÄѰַ·½Ê½¡£Ô¼ÊøÒ²¿ÉÒÔÖ¸¶¨£º

    ·ÊÇ·ñÔÊÐí²Ù×÷ÊýλÓڼĴæÆ÷ÖУ¬ÒÔ¼°Ëü¿ÉÒÔ°üÀ¨ÔÚÄÄЩÖÖÀàµÄ¼Ä´æÆ÷ÖÐ
    ·²Ù×÷ÊýÊÇ·ñ¿ÉÒÔÊÇÄÚ´æÒýÓã¬ÒÔ¼°ÔÚÕâÖÖÇé¿öÏÂʹÓÃÄÄЩÖÖÀàµÄµØÖ·
    ·²Ù×÷ÊýÊÇ·ñ¿ÉÒÔÊÇÁ¢¼´Êý

Ô¼Êø»¹ÒªÇóÁ½¸ö²Ù×÷ÊýÆ¥Åä¡£

³£ÓÃÔ¼Êø

    ÔÚ¿ÉÓõIJÙ×÷ÊýÔ¼ÊøÖУ¬Ö»ÓÐһС²¿·ÖÊdz£Óõģ»ÏÂÃæÁгöÁËÕâÐ©Ô¼ÊøÒÔ¼°¼òÒªÃèÊö¡£ÓйزÙ×÷ÊýÔ¼ÊøµÄÍêÕûÁÐ±í£¬Çë²Î¿¼ GCC ºÍ GAS Êֲᡣ

¼Ä´æÆ÷²Ù×÷ÊýÔ¼Êø (r)
    ʹÓÃÕâÖÖÔ¼ÊøÖ¸¶¨²Ù×÷Êýʱ£¬ËüÃÇ´æ´¢ÔÚͨÓüĴæÆ÷ÖС£Çë¿´ÏÂÀý£º
           asm ("movl %%cr3, %0\n" :"=r"(cr3val));
    ÕâÀ±äÁ¿ cr3val ±£´æÔڼĴæÆ÷ÖУ¬%cr3 µÄÖµ¸´ÖƵ½¼Ä´æÆ÷ÉÏ£¬cr3val µÄÖµ´Ó¸Ã¼Ä´æÆ÷¸üе½ÄÚ´æÖС£Ö¸¶¨ "r" Ô¼ÊøÊ±£¬GCC ¿ÉÒÔ½«±äÁ¿ cr3val ±£´æÔÚÈκοÉÓÃµÄ GPR ÖС£ÒªÖ¸¶¨¼Ä´æÆ÷£¬±ØÐëͨ¹ýʹÓÃÌØ¶¨µÄ¼Ä´æÆ÷Ô¼ÊøÖ±½ÓÖ¸¶¨¼Ä´æÆ÷Ãû¡£

a   %eax
b   %ebx
c   %ecx
d   %edx
S   %esi
D   %edi

ÄÚ´æ²Ù×÷ÊýÔ¼Êø (m)
    µ±²Ù×÷ÊýλÓÚÄÚ´æÖÐʱ£¬ÈκζÔËüÃÇÖ´ÐеIJÙ×÷¶¼½«ÔÚÄÚ´æÎ»ÖÃÖÐÖ±½Ó·¢Éú£¬ÕâÓë¼Ä´æÆ÷Ô¼ÊøÕýºÃÏà·´£¬ºóÕßÏȽ«Öµ´æ´¢ÔÚÒªÐ޸ĵļĴæÆ÷ÖУ¬È»ºó½«Ëüд»ØÄÚ´æÎ»ÖÃÖС£µ«¼Ä´æÆ÷Ô¼ÊøÍ¨³£Ö»ÔÚ¶ÔÓÚÖ¸ÁîÀ´ËµËüÃÇÊǾø¶Ô±ØÐèµÄ£¬»òÕßËüÃÇ¿ÉÒÔ´ó´óÌá¸ß½ø³ÌËÙ¶ÈʱʹÓᣵ±ÐèÒªÔÚ "asm" ÄÚ²¿¸üРC ±äÁ¿£¬¶øÄúÓÖȷʵ²»Ï£ÍûʹÓüĴæÆ÷À´±£´æÆäֵʱ£¬Ê¹ÓÃÄÚ´æÔ¼Êø×îΪÓÐЧ¡£ÀýÈ磬idtr µÄÖµ´æ´¢ÔÚÄÚ´æÎ»Öà loc ÖУº
        ("sidt %0\n" : :"m"(loc));

Æ¥Å䣨Êý×Ö£©Ô¼Êø
    ÔÚijЩÇé¿öÏ£¬Ò»¸ö±äÁ¿¼ÈÒª³äµ±ÊäÈë²Ù×÷Êý£¬Ò²Òª³äµ±Êä³ö²Ù×÷Êý¡£¿ÉÒÔͨ¹ýʹÓÃÆ¥ÅäÔ¼ÊøÔÚ "asm" ÖÐÖ¸¶¨ÕâÖÖÇé¿ö¡£

        asm ("incl %0" :"=a"(var):"0"(var));

    ÔÚÆ¥ÅäÔ¼ÊøµÄʾÀýÖУ¬¼Ä´æÆ÷ %eax ¼ÈÓÃ×÷ÊäÈë±äÁ¿£¬Ò²ÓÃ×÷Êä³ö±äÁ¿¡£½« var ÊäÈë¶ÁÈ¡µ½ %eax£¬Ôö¼Óºó½«¸üÐ嵀 %eax Ôٴδ洢ÔÚ var ÖС£ÕâÀïµÄ "0" Ö¸¶¨µÚ 0 ¸öÊä³ö±äÁ¿ÏàͬµÄÔ¼Êø¡£¼´£¬ËüÖ¸¶¨ var µÄÊä³öʵÀýÖ»Ó¦¸Ã´æ´¢ÔÚ %eax ÖС£¸ÃÔ¼Êø¿ÉÒÔÓÃÓÚÒÔÏÂÇé¿ö£º

   ·ÊäÈë´Ó±äÁ¿ÖжÁÈ¡£¬»òÕß±äÁ¿±»Ð޸ĺó£¬ÐÞ¸Äд»Øµ½Í¬Ò»±äÁ¿ÖÐ
   ·²»ÐèÒª½«ÊäÈë²Ù×÷ÊýºÍÊä³ö²Ù×÷ÊýµÄʵÀý·Ö¿ª
   ·Ê¹ÓÃÆ¥ÅäÔ¼Êø×îÖØÒªµÄÒâÒåÔÚÓÚËüÃÇ¿ÉÒÔµ¼ÖÂÓÐЧµØÊ¹ÓÿÉÓüĴæÆ÷¡£


[Ŀ¼]


ʾÀý

Ò»°ãÄÚÁª»ã±àÓ÷¨Ê¾Àý
    ÒÔÏÂʾÀýͨ¹ý¸÷ÖÖ²»Í¬µÄ²Ù×÷ÊýÔ¼ÊøËµÃ÷ÁËÓ÷¨¡£ÓÐÈç´Ë¶àµÄÔ¼ÊøÒÔÖÁÓÚÎÞ·¨½«ËüÃÇÒ»Ò»Áгö£¬ÕâÀïÖ»ÁгöÁË×î¾­³£Ê¹ÓõÄÄÇÐ©Ô¼ÊøÀàÐÍ¡£


[Ŀ¼]


¼Ä´æÆ÷Ô¼Êø

"asm" ºÍ¼Ä´æÆ÷Ô¼Êø "r"
    ÈÃÎÒÃÇÏÈ¿´Ò»ÏÂʹÓüĴæÆ÷Ô¼Êø r µÄ "asm"¡£ÎÒÃǵÄʾÀýÏÔʾÁË GCC ÈçºÎ·ÖÅä¼Ä´æÆ÷£¬ÒÔ¼°ËüÈçºÎ¸üÐÂÊä³ö±äÁ¿µÄÖµ¡£

int main(void)
{
    int x = 10, y;
    asm ("movl %1, %%eax;
         "movl %%eax, %0;"
         :"=r"(y)  /* y is output operand */
         :"r"(x)       /* x is input operand */
         :"%eax"); /* %eax is clobbered register */
}

    ÔÚ¸ÃÀýÖУ¬x µÄÖµ¸´ÖÆÎª "asm" ÖÐµÄ y¡£x ºÍ y ¶¼Í¨¹ý´æ´¢ÔڼĴæÆ÷Öд«µÝ¸ø "asm"¡£Îª¸ÃÀýÉú³ÉµÄ»ã±à´úÂëÈçÏ£º

main:
pushl %ebp
movl %esp,%ebp
subl $8,%esp
movl $10,-4(%ebp)
movl -4(%ebp),%edx  /* x=10 is stored in %edx */
#APP    /* asm starts here */
movl %edx, %eax     /* x is moved to %eax */
movl %eax, %edx     /* y is allocated in edx and updated */
#NO_APP /* asm ends here */
movl %edx,-8(%ebp)  /* value of y in stack is updated with the value in %edx */

    µ±Ê¹Óà "r" Ô¼ÊøÊ±£¬GCC ÔÚÕâÀï¿ÉÒÔ×ÔÓÉ·ÖÅäÈκμĴæÆ÷¡£ÔÚÎÒÃǵÄʾÀýÖУ¬ËüÑ¡Ôñ %edx À´´æ´¢ x¡£ÔÚ¶ÁÈ¡ÁË %edx ÖÐ x µÄÖµºó£¬ËüΪ y Ò²·ÖÅäÁËÏàͬµÄ¼Ä´æÆ÷¡£

    ÒòΪ y ÊÇÔÚÊä³ö²Ù×÷Êý²¿·ÖÖÐÖ¸¶¨µÄ£¬ËùÒÔ %edx ÖиüеÄÖµ´æ´¢ÔÚ -8(%ebp)£¬¶ÑÕ»ÉÏ y µÄλÖÃÖС£Èç¹û y ÊÇÔÚÊäÈ벿·ÖÖÐÖ¸¶¨µÄ£¬ÄÇô¼´Ê¹ËüÔÚ y µÄÁÙʱ¼Ä´æÆ÷´æ´¢Öµ (%edx) Öб»¸üУ¬¶ÑÕ»ÉÏ y µÄÖµÒ²²»»á¸üС£

    ÒòΪ %eax ÊÇÔÚÐÞÊÎÁбíÖÐÖ¸¶¨µÄ£¬GCC ²»ÔÚÈÎºÎÆäËüµØ·½Ê¹ÓÃËüÀ´´æ´¢Êý¾Ý¡£

    ÊäÈë x ºÍÊä³ö y ¶¼·ÖÅäÔÚͬһ¸ö %edx ¼Ä´æÆ÷ÖУ¬¼ÙÉèÊäÈëÔÚÊä³ö²úÉú֮ǰ±»ÏûºÄ¡£Çë×¢Ò⣬Èç¹ûÄúÓÐÐí¶àÖ¸Á¾Í²»ÊÇÕâÖÖÇé¿öÁË¡£ÒªÈ·±£ÊäÈëºÍÊä³ö·ÖÅäµ½²»Í¬µÄ¼Ä´æÆ÷ÖУ¬¿ÉÒÔÖ¸¶¨ & Ô¼ÊøÐÞÊηû¡£ÏÂÃæÊÇÌí¼ÓÁËÔ¼ÊøÐÞÊηûµÄʾÀý¡£

int main(void)
{
    int x = 10, y;
    asm ("movl %1, %%eax;
         "movl %%eax, %0;"
        :"=&r"(y) /* y is output operand, note the & constraint modifier. */
        :"r"(x)       /* x is input operand */
        :"%eax"); /* %eax is clobbered register */
}

    ÒÔÏÂÊÇΪ¸ÃʾÀýÉú³ÉµÄ»ã±à´úÂ룬´ÓÖпÉÒÔÃ÷ÏԵؿ´³ö x ºÍ y ´æ´¢ÔÚ "asm" Öв»Í¬µÄ¼Ä´æÆ÷ÖС£

main:
pushl %ebp
movl %esp,%ebp
subl $8,%esp
movl $10,-4(%ebp)
movl -4(%ebp),%ecx  /* x, the input is in %ecx */
#APP
    movl %ecx, %eax
    movl %eax, %edx     /* y, the output is in %edx */
#NO_APP
movl %edx,-8(%ebp)

ÌØ¶¨¼Ä´æÆ÷Ô¼ÊøµÄʹÓÃ
    ÏÖÔÚÈÃÎÒÃÇ¿´Ò»ÏÂÈçºÎ½«¸ö±ð¼Ä´æÆ÷×÷Ϊ²Ù×÷ÊýµÄÔ¼ÊøÖ¸¶¨¡£ÔÚÏÂÃæµÄʾÀýÖУ¬cpuid Ö¸Áî²ÉÓà %eax ¼Ä´æÆ÷ÖеÄÊäÈ룬ȻºóÔÚËĸö¼Ä´æÆ÷Öиø³öÊä³ö£º%eax¡¢%ebx¡¢%ecx¡¢%edx¡£¶Ô cpuid µÄÊäÈ루±äÁ¿ "op"£©´«µÝµ½ "asm" µÄ eax ¼Ä´æÆ÷ÖУ¬ÒòΪ cpuid Ï£ÍûËüÕâÑù×ö¡£ÔÚÊä³öÖÐʹÓà a¡¢b¡¢c ºÍ d Ô¼Êø£¬·Ö±ðÊÕ¼¯Ëĸö¼Ä´æÆ÷ÖеÄÖµ¡£

        asm ("cpuid"
              : "=a" (_eax),
              "=b" (_ebx),
              "=c" (_ecx),
              "=d" (_edx)
              : "a" (op));

    ÔÚÏÂÃæ¿ÉÒÔ¿´µ½ÎªËüÉú³ÉµÄ»ã±à´úÂ루¼ÙÉè _eax¡¢_ebx µÈ... ±äÁ¿¶¼´æ´¢ÔÚ¶ÑÕ»ÉÏ£©£º

movl -20(%ebp),%eax /* store 'op' in %eax -- input */
#APP
cpuid
#NO_APP
movl %eax,-4(%ebp)  /* store %eax in _eax -- output */
movl %ebx,-8(%ebp)  /* store other registers in
movl %ecx,-12(%ebp)
respective output variables */
movl %edx,-16(%ebp)

strcpy º¯Êý¿ÉÒÔͨ¹ýÒÔÏ·½Ê½Ê¹Óà "S" ºÍ "D" Ô¼ÊøÀ´ÊµÏÖ£º

        asm ("cld\n
              rep\n
              movsb"
              : /* no input */
              :"S"(src), "D"(dst), "c"(count));

    ͨ¹ýʹÓà "S" Ô¼Êø½«Ô´Ö¸Õë src ·ÅÈë %esi ÖУ¬Ê¹Óà "D" Ô¼Êø½«Ä¿µÄÖ¸Õë dst ·ÅÈë %edi ÖС£ÒòΪ rep ǰ׺ÐèÒª count Öµ£¬ËùÒÔ½«Ëü·ÅÈë %ecx ÖС£

    ÔÚÏÂÃæ¿ÉÒÔ¿´µ½ÁíÒ»¸öÔ¼Êø£¬ËüʹÓÃÁ½¸ö¼Ä´æÆ÷ %eax ºÍ %edx ½«Á½¸ö 32 λµÄÖµºÏ²¢ÔÚÒ»Æð£¬È»ºóÉú³ÉÒ»¸ö64 λµÄÖµ£º

#define rdtscll(val) \
__asm__ __volatile__ ("rdtsc" : "=A" (val))
The generated assembly looks like this (if val has a 64 bit memory space).
#APP
rdtsc
#NO_APP
movl %eax,-8(%ebp)  /* As a result of A constraint
movl %edx,-4(%ebp)
%eax and %edx serve as outputs */
Note here that the values in %edx:%eax serve as 64 bit output.


[Ŀ¼]


Æ¥ÅäÔ¼Êø

ʹÓÃÆ¥ÅäÔ¼Êø
    ÔÚÏÂÃæ½«¿´µ½ÏµÍ³µ÷ÓõĴúÂ룬ËüÓÐËĸö²ÎÊý£º

#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \
: "=a" (__res) \
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \
"d" ((long)(arg3)),"S" ((long)(arg4))); \
__syscall_return(type,__res); \
}

    ÔÚÉÏÀýÖУ¬Í¨¹ýʹÓà b¡¢c¡¢d ºÍ S Ô¼Êø½«ÏµÍ³µ÷ÓõÄËĸö×Ô±äÁ¿·ÅÈë %ebx¡¢%ecx¡¢%edx ºÍ %esi ÖС£Çë×¢Ò⣬ÔÚÊä³öÖÐʹÓÃÁË "=a" Ô¼Êø£¬ÕâÑù£¬Î»ÓÚ %eax ÖеÄϵͳµ÷Óõķµ»ØÖµ¾Í±»·ÅÈë±äÁ¿ __res ÖС£Í¨¹ý½«Æ¥ÅäÔ¼Êø "0" ÓÃ×÷ÊäÈ벿·ÖÖеÚÒ»¸ö²Ù×÷ÊýÔ¼Êø£¬syscall ºÅ __NR_##name ±»·ÅÈë %eax ÖУ¬²¢ÓÃ×÷¶Ôϵͳµ÷ÓõÄÊäÈë¡£ÕâÑù£¬ÕâÀïµÄ %eax ¼È¿ÉÒÔÓÃ×÷ÊäÈë¼Ä´æÆ÷£¬ÓÖ¿ÉÒÔÓÃ×÷Êä³ö¼Ä´æÆ÷¡£Ã»ÓÐÆäËü¼Ä´æÆ÷ÓÃÓÚÕâ¸öÄ¿µÄ¡£ÁíÇë×¢Ò⣬ÊäÈ루syscall ºÅ£©ÔÚ²úÉúÊä³ö£¨syscall µÄ·µ»ØÖµ£©Ö®Ç°±»ÏûºÄ£¨Ê¹Óã©¡£

[Ŀ¼]


ÄÚ´æ²Ù×÷ÊýÔ¼Êø

ÄÚ´æ²Ù×÷ÊýÔ¼ÊøµÄʹÓÃ
    Ç뿼ÂÇÏÂÃæµÄÔ­×ӵݼõ²Ù×÷£º

        __asm__ __volatile__(
                "lock; decl %0"
                :"=m" (counter)
                :"m" (counter));

    ΪËüÉú³ÉµÄ»ã±àÀàËÆÓÚ£º

#APP
    lock
    decl -24(%ebp) /* counter is modified on its memory location */
#NO_APP.

    Äú¿ÉÄÜ¿¼ÂÇÔÚÕâÀïΪ counter ʹÓüĴæÆ÷Ô¼Êø¡£Èç¹ûÕâÑù×ö£¬counter µÄÖµ±ØÐëÏȸ´ÖƵ½¼Ä´æÆ÷£¬µÝ¼õ£¬È»ºó¶ÔÆäÄÚ´æ¸üС£µ«ÕâÑùÄú»áÎÞ·¨Àí½âËø¶¨ºÍÔ­×ÓÐÔµÄÈ«²¿Òâͼ£¬ÕâЩÃ÷È·ÏÔʾÁËʹÓÃÄÚ´æÔ¼ÊøµÄ±ØÒªÐÔ¡£

[Ŀ¼]


ÐÞÊμĴæÆ÷

ʹÓÃÐÞÊμĴæÆ÷
    Ç뿼ÂÇÄڴ濽±´µÄ»ù±¾ÊµÏÖ¡£

       asm ("movl $count, %%ecx;
            up: lodsl;
            stosl;
            loop up;"
            :           /* no output */
            :"S"(src), "D"(dst) /* input */
            :"%ecx", "%eax" );  /* clobbered list */

    µ± lodsl ÐÞ¸Ä %eax ʱ£¬lodsl ºÍ stosl Ö¸ÁîÒþº¬µØÊ¹ÓÃËü¡£%ecx ¼Ä´æÆ÷Ã÷È·×°Èë count¡£µ« GCC ÔÚÎÒÃÇ֪ͨËüÒÔǰÊDz»ÖªµÀÕâЩµÄ£¬ÎÒÃÇÊÇͨ¹ý½« %eax ºÍ %ecx °üÀ¨ÔÚÐÞÊμĴæÆ÷¼¯ÖÐÀ´Í¨Öª GCC µÄ¡£ÔÚÍê³ÉÕâÒ»²½Ö®Ç°£¬GCC ¼ÙÉè %eax ºÍ %ecx ÊÇ×ÔÓɵģ¬Ëü¿ÉÄܾö¶¨½«ËüÃÇÓÃ×÷´æ´¢ÆäËüµÄÊý¾Ý¡£Çë×¢Ò⣬%esi ºÍ %edi ÓÉ "asm" ʹÓã¬ËüÃDz»ÔÚÐÞÊÎÁбíÖС£ÕâÊÇÒòΪÒѾ­ÉùÃ÷ "asm" ½«ÔÚÊäÈë²Ù×÷ÊýÁбíÖÐʹÓÃËüÃÇ¡£ÕâÀï×îµÍÏÞ¶ÈÊÇ£¬Èç¹ûÔÚ "asm" ÄÚ²¿Ê¹ÓüĴæÆ÷£¨ÎÞÂÛÊÇÃ÷È·»¹ÊÇÒþº¬µØ£©£¬¼È²»³öÏÖÔÚÊäÈë²Ù×÷ÊýÁбíÖУ¬Ò²²»³öÏÖÔÚÊä³ö²Ù×÷ÊýÁбíÖУ¬±ØÐ뽫ËüÁÐΪÐÞÊμĴæÆ÷¡£

[Ŀ¼]


²»Í¬µÄCPUÏÂ×î¼Ñ±àÒë²ÎÊý

    gccÔÚ²»Í¬µÄÌåϵ»ú¹¹/CPUϱàÒëЧ¹ûÓв»Í¬£¬ÐèҪʹÓò»Í¬µÄ±àÒë²ÎÊý´ïµ½×î¼ÑЧ¹û¡£


Ò»¡¢1.2°æ(gcc 2.9.x°æ)

-pipe -fomit-frame-pointer"
CXXFLAGS="-march=i486 -O3 -pipe -fomit-frame-pointer"

Pentium, Pentium MMX+, Celeron (Mendocino) (Intel)
CHOST="i586-pc-linux-gnu"
CFLAGS="-march=pentium -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=pentium -O3 -pipe -fomit-frame-pointer"

Pentium Pro/II/III/4, Celeron (Coppermine), Celeron (Willamette?) (Intel)
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=i686 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=i686 -O3 -pipe -fomit-frame-pointer"

Eden C3/Ezra (Via)
CHOST="i586-pc-linux-gnu"
CFLAGS="-march=i586 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=i586 -O3 -pipe -fomit-frame-pointer"

Quote : I did the original gentoo install using 1.2, with gcc 2.95 using -march=i586. i686 won't work.

K6 or beyond (AMD)
CHOST="i586-pc-linux-gnu"
CFLAGS="-march=k6 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=k6 -O3 -pipe -fomit-frame-pointer"

(A Duron will report "Athlon" in its /proc/cpuinfo)

Athlon (AMD)
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=k6 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=k6 -O3 -pipe -fomit-frame-pointer"

For the following, i don't know of any flag that enhance performances..., do you ?

PowerPC
CHOST="powerpc-unknown-linux-gnu"
CFLAGS="-O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-O3 -pipe -fomit-frame-pointer"

Sparc
CHOST="sparc-unknown-linux-gnu"
CFLAGS="-O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-O3 -pipe -fomit-frame-pointer"

Sparc 64
CHOST="sparc64-unknown-linux-gnu"
CFLAGS="-O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-O3 -pipe -fomit-frame-pointer"

¶þ¡¢1.4°æ(gcc 3.x°æ):


i386 (Intel), do you really want to install gentoo on that ?
CHOST="i386-pc-linux-gnu"
CFLAGS="-march=i386 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=i386 -O3 -pipe -fomit-frame-pointer"

i486 (Intel), do you really want to install gentoo on that ?
CHOST="i486-pc-linux-gnu"
CFLAGS="-march=i486 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=i486 -O3 -pipe -fomit-frame-pointer"

Pentium 1 (Intel)
CHOST="i586-pc-linux-gnu"
CFLAGS="-march=pentium -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=pentium -O3 -pipe -fomit-frame-pointer"

Pentium MMX (Intel)
CHOST="i586-pc-linux-gnu"
CFLAGS="-march=pentium-mmx -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=pentium-mmx -O3 -pipe -fomit-frame-pointer"

Pentium PRO (Intel)
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=pentiumpro -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=pentiumpro -O3 -pipe -fomit-frame-pointer"

Pentium II (Intel)
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"

Celeron (Mendocino), aka Celeron1 (Intel)
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=pentium2 -O3 -pipe -fomit-frame-pointer"

Pentium III (Intel)
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer"

Celeron (Coppermine) aka Celeron2 (Intel)
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=pentium3 -O3 -pipe -fomit-frame-pointer"

Celeron (Willamette?) (Intel)
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"

Pentium 4 (Intel)
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=pentium4 -O3 -pipe -fomit-frame-pointer"

Eden C3/Ezra (Via)
CHOST="i586-pc-linux-gnu"
CFLAGS="-march=i586 -m3dnow -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=i586 -m3dnow -O3 -pipe -fomit-frame-pointer"

quote : the ezra doesn't have any special instructions that you could optimize for, just consider is a K6-3...basically
a p2 with 3dnow

K6 (AMD)
CHOST="i586-pc-linux-gnu"
CFLAGS="-march=k6 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=k6 -O3 -pipe -fomit-frame-pointer"

K6-2 (AMD)
CHOST="i586-pc-linux-gnu"
CFLAGS="-march=k6-2 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=k6-2 -O3 -pipe -fomit-frame-pointer"

K6-3 (AMD)
CHOST="i586-pc-linux-gnu"
CFLAGS="-march=k6-3 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=k6-3 -O3 -pipe -fomit-frame-pointer"

Athlon (AMD)
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=athlon -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=athlon -O3 -pipe -fomit-frame-pointer"

Athlon-tbird, aka K7 (AMD)
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=athlon-tbird -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=athlon-tbird -O3 -pipe -fomit-frame-pointer"

Athlon-tbird XP (AMD)
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"

Athlon 4(AMD)
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=athlon-4 -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=athlon-4 -O3 -pipe -fomit-frame-pointer"

Athlon XP (AMD)
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=athlon-xp -O3 -pipe -fomit-frame-pointer"

Athlon MP (AMD)
CHOST="i686-pc-linux-gnu"
CFLAGS="-march=athlon-mp -O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-march=athlon-mp -O3 -pipe -fomit-frame-pointer"

603 (PowerPC)
CHOST="powerpc-unknown-linux-gnu"
CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"
CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"

603e (PowerPC)
CHOST="powerpc-unknown-linux-gnu"
CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"
CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"

604 (PowerPC)
CHOST="powerpc-unknown-linux-gnu"
CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"
CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"

604e (PowerPC)
CHOST="powerpc-unknown-linux-gnu"
CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"
CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"

750 aka as G3 (PowerPC)
CHOST="powerpc-unknown-linux-gnu"
CFLAGS="-mcpu=750 -O3 -pipe -fomit-frame-pointer
-fsigned-char"
CXXFLAGS="-mcpu=750 -O3 -pipe -fomit-frame-pointer
-fsigned-char"

Note: do not use -march=

7400, aka G4 (PowerPC)
CHOST="powerpc-unknown-linux-gnu"
CFLAGS="-mcpu=7400 -O3 -pipe -fomit-frame-pointer
-fsigned-char -maltivec"
CXXFLAGS="-mcpu=7400 -O3 -pipe -fomit-frame-pointer
-fsigned-char -maltivec"

Note: do not use -march=

7450, aka G4 second generation (PowerPC)
CHOST="powerpc-unknown-linux-gnu"
CFLAGS="-mcpu=7450 -O3 -pipe -fomit-frame-pointer
-fsigned-char -maltivec"
CXXFLAGS="-mcpu=7450 -O3 -pipe -fomit-frame-pointer
-fsigned-char -maltivec"

Note: do not use -march=

PowerPC (If you don't know which one)
CHOST="powerpc-unknown-linux-gnu"
CFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"
CXXFLAGS="-O3 -pipe -fomit-frame-pointer -fsigned-char"

Sparc
CHOST="sparc-unknown-linux-gnu"
CFLAGS="-O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-O3 -pipe -fomit-frame-pointer"

Sparc 64
CHOST="sparc64-unknown-linux-gnu"
CFLAGS="-O3 -pipe -fomit-frame-pointer"
CXXFLAGS="-O3 -pipe -fomit-frame-pointer"

[Ŀ¼]


´úÂëά»¤

[Ŀ¼]


¼òµ¥cvs

¼òµ¥CVS
Ò»¡¢ËùÒª½â¾öµÄÎÊÌâ
    ÓÉÓÚÈí¼þÏîĿԽÀ´Ô½´ó£¬Ò²Ôö¼ÓÁËÈí¼þÏîÄ¿¹ÜÀíµÄÄѶȡ£ÔÚ¿ª·¢×éÖУ¬Ã¿¸ö³ÉÔ±¶¼Òª±£ÁôÒ»¸ö¸±±¾£¬ÔÚ¿ª·¢Öзdz£ÈÝÒ×ÒýÆð³åÍ»¡£CVS ¾ÍÊÇΪÁ˽â¾öÕâ¸öÎÊÌâµÄ¡£

    a¡¢ÐÞ¸Äͬ²½£¬·ÀÖ¹Ò»Ãû¿ª·¢ÈËÔ±µÄÐ޸ĸ²¸ÇÆäËûÈ˵ijɹû¡££¨check out¡¢read only£©

    b¡¢Î¬»¤²»Í¬µÄ°æ±¾¡££¨°´ version ²éÕÒ£©

    c¡¢¿É²éÕÒÀúÊ·¼Ç¼¡£·ÀÖ¹ bug µÄÔÙÒýÈë¡££¨diff£©

    CVS ΪÁ˽â¾öÕâ¸öÎÊÌ⣬²ÉÓõķ½Ê½ÊÇ£º

    µ±¿ª·¢ÈËÔ±¶ÔÔ´´úÂë½øÐÐÐÞ¸Äʱ£¬Ð޸ĵÄÄÚÈݱ»µÇ¼Ç£¨check in£©µ½ÁË CVS ²Ö¿â£¨repository£©ÖС£²Ö¿âÖб£´æÁË´úÂëµÄÖ÷¿Ø¸±±¾£¬ÒÔ¼°Àú´ÎÐ޸ĵÄÀúÊ·ÐÅÏ¢¡£Ëü²»±£´æÎļþµÄÿ¸ö°æ±¾£¬¶øÖ»ÊǼòµ¥µÄ¼Ç¼·¢ÉúÔÚÿ¸ö°æ±¾¼äµÄ²»Í¬£¬½ÚÊ¡´ÅÅ̿ռ䡣ËüÄÜ×öµ½£º

    a¡¢Ê¹¿ª·¢ÈËÔ±µÄĿ¼ºÍ²Ö¿â±£³ÖÒ»Ö¡£¿ÉÒÔ°Ñ×Ô¼ºµÄÐÞ¸ÄÌá½»£¨commit£©¸ø²Ö¿â£¬Èòֿâ¸üÐÂ×Ô¼º¡£

    b¡¢ÔÊÐí´úÂëÅÉÉú¡£¿ÉÒÔ½øÐвâÊÔ£¬Èç¹ûʧ°Ü£¬¿ÉÒÔÏû³ýËù×öµÄÐ޸ģ¬Î¬³ÖÔ­½á¹û¡£

    c¡¢¼ìË÷ÈκÎÒ»¸ö°æ±¾¡£

¶þ¡¢Ê¹Óà CVS£º

    a¡¢½¨Á¢²Ö¿â£ºÉèÖò¢ export CVSROOT ±äÁ¿£¬²¢ÉèÖòֿâĿ¼¡£±ÈÈç´´½¨ /home/cvsroot Ŀ¼£¬²¢ºÏÀíÉèÖÃȨÏÞ£¬ÔÚ .bash_profile ÖмÓÈ룺export CVSROOT=$HOME/cvsroot£»ÔËÐÐ cvs init£»ÉèÖÃÈÃÓû§ÊäÈëÈÕÖ¾ÐÅÏ¢µÄĬÈϵı༭Æ÷£ºexport EDITOR=vim¡£Èç¹ûʹÓõÄÊÇÍøÂ磬Ôò CVSROOT ±äÁ¿µÄÐÎʽÊÇ£º export CVSROOT=:exit:user@server:/path£¬±ÈÈ磺export CVSROOT=:exit:david@power/home/projects/repository

    b¡¢µ¼ÈëÎļþ»òĿ¼£ºcvs import filename_or_directory vender_tag release_tag£»ÕâÈý¸ö²ÎÊýµÄº¬ÒåÊÇ£ºÔÚ²Ö¿âÖÐÕâЩµ¼ÈëµÄÎļþËùÔÚµÄĿ¼¡¢¹©Ó¦É̱ê¼Ç¡¢·¢Ðбê¼Ç¡£±ÈÈç cvs import step1 david start¡£µ¼ÈëʱµÄ N ±íʾËùµ¼ÈëµÄÎļþ¶¼ÊÇÐÂÎļþ¡£

    c¡¢Ê¹ÓÃʱµ¼³öÎļþ£¬Óãºcvs checkout directory_name£»²ÎÊýº¬ÒåÊDzֿâÖÐËùÔÚµÄĿ¼¡£½¨Á¢ÐµÄĿ¼£¬¶ø²»ÊÇ»ñÈ¡ËûÈ˵ĸ͝

    d¡¢¶ÔÎļþÐ޸ĺ󣬱£´æÐ޸ĵ½²Ö¿â£ºcvs commit¡£

    e¡¢Èç¹ûÒª»ñµÃËûÈ˵ÄÐ޸ģ¬Ê¹Óà cvs update£¬U ±íʾ±¾µØµÄÒ»¸öÎļþÒѾ­±»¸üС£Èç¹ûÒѾ­¶ÔÎļþ½øÐÐÁËÐ޸쬶ø´ËÊÇËûÈËÒѾ­ÐÞ¸ÄÁ˸ÃÎļþ²¢Ìá½»£¬cvs ½«¸æËßÓû§·¢Éú³åÍ»ºÍ³åÍ»µÄλÖá£

    f¡¢Ìí¼ÓÒ»¸öÎļþ£ºcvs add filename; cvs commit¡£

    g¡¢É¾³ýÒ»¸öÎļþ£ºÏÈÔÚ±¾µØÉ¾³ý£¬È»ºóʹÓà cvs remove file_name; cvs commit¡£

Èý¡¢Ê¹Óñê¼Ç

    ¿ÉÒÔʹÓñê¼Ç¼Ç¼ij¸öʱ¿ÌÎļþµÄÄÚÈÝ£¬ÕâÔÚÖÆ×÷·¢Ðа汾µÄ¹ý³ÌÖзdz£ÓÐÓãº

    cvs tag release1.0

    ¸Ä¶¯ºó·¢ÏÖ²»Õý³££¬ÖØÐ»ñµÃÕâ¸ö°æ±¾£¬ÔòʹÓãºcvs checkout -r release1.0

ËÄ¡¢²âÊÔÐÔ´úÂ룺

    µ±ÆäÖÐÒ»¸ö¿ª·¢Õß¶Ô´úÂë½øÐиĽø£¬µ«Î´À´½á¹û²»ÄÜÈ·¶¨Ê±£¬¿ÉÒÔʹÓà cvs ²úÉú³öÒ»¸ö´úÂëµÄ·ÖÖ®£¬Õâ²¢²»¸Ä±äÖ÷¿Ø´úÂ룺cvs tag -b for_test¡£µ¼³ö¸Ã´úÂëµÄÃüÁîÊÇ£ºcvs checkout -r for_test example¡£ÓÉÓÚÔÚÒÑÓеÄĿ¼Ê÷Öв»»áʹÓø÷ÖÖ®£¬Òò´Ë±ØÐëÖØÐ½¨Á¢Ä¿Â¼Ê÷¡£Èç¹û²âÊԳɹ¦£¬ÔòÒªÇó½«Ö÷¿Ø´úÂëºÍ²âÊÔ´úÂëºÏ²¢£¬ÔòÏȵ¼³öÖ÷¿Ø´úÂ룬ȻºóºÏ²¢£º

    cvs checkout;cvs update -jfor_test;cvs commit¡£


[Ŀ¼]


automake

    ͨ³£Çé¿öÏ£¬ÔÚдÍê×Ô¼º´úÂëºó£¬Ê¹Óà make ÃüÁî½øÐбàÒë¡£make ÃüÁîÆäʵʲôҲ²»×ö£¬ÖªÊ¶¶Áȡһ¸ö½Ð Makefile µÄÎļþ£¬´ÓÖлñµÃ dependence and rule£¬È»ºóµ÷Óà gcc ½øÐбàÒë¡£µ«ÊÇ Makefile ±È½Ï¸´ÔÓ£¬±ä»¯¼¼ÇÉÒ²±È½Ï¶à¡£¶ÔÓÚÒ»¸ö´óµÄ¹¤³ÌÏîÄ¿À´Ëµ£¬Èç¹ûûÓÐÒ»¸öͳһµÄ·ç¸ñ£¬ÔÚ¹¤³ÌÑÓÐøµÄʱºò¸Ä¶¯ Makefile »áºÜÂé·³£¬Ò²ÈÝÒ׳ö´íÎó¡£ËùÒÔÕâʱ¾ÍÓÐÁËʹÓà automake µÄÐèÇó¡£Ê¹Óà automake£¬Ö»ÐèÒªÕÆÎÕÒ»µãµã¹æÔò£¬¶¨ÒåһЩ±äÁ¿£¬¾ÍÄÜ×Ô¶¯Éú³É Makefile¡£¶øÕâЩ Makefile ÓÐ×ÅͳһµÄ¸ñʽºÍ½á¹¹£¬±ãÓÚÐ޸ġ£ÏÂÃæ¾ÍÈçºÎʹÓà automake ¾Ù³öÒ»¸öʵ¼ÊµÄÀý×Ó¡£

2.1 ʹÓà automake µÄǰÌáÌõ¼þ


    ÔÚʹÓà automake ǰ£¬ÇëÏÈÈ·ÈÏÔÚϵͳÖа²×°ÁËÈçÏÂÈí¼þ£º

    GNU Automake

    GNU Autoconf

    GNU m4

    perl

    GNU Libtool£¨Èç¹ûÐèÒª²úÉú shared library£©Èç¹ûûÓеϰ£¬ÇëÔÚ·¢ÐаæÖÐÕÒÏàÓ¦µÄ rpm °ü¡£

2.2 ÖÆ×÷ configure ½Å±¾

autoconf ÊÇÓÃÀ´Éú³É×Ô¶¯ÅäÖÃÈí¼þÔ´´úÂë½Å±¾£¨configure£©µÄ¹¤¾ß¡£configure ½Å±¾¶ÀÁ¢ÓÚ autoconf ÔËÐУ¬¶øÇÒÔÚÔËÐеĹý³ÌÖУ¬²»ÐèÒªÓû§µÄ¸ÉÔ¤£¬Í¨³£²»ÐèÒª¸½´ø²ÎÊý¡£ËüÊÇÓÃÀ´¼ìÑéÈí¼þ±ØÐëµÄ²ÎÊýµÄ¡£autoconf ´ÓÒ»¸öÁоٱàÒëÈí¼þʱËùÐèÒª¸÷ÖÖ²ÎÊýµÄÄ£°åÎļþÖд´½¨ configure¡£autoconf ÐèÒª GNU m4 À´Éú³É¸Ã½Å±¾¡£

ÓÉ autoconf Éú³ÉµÄ½Å±¾Ò»°ãÆðÃûΪ configure¡£µ±ÔËÐÐʱ£¬configure ´´½¨Á˶à¸öÎļþ£¬²¢¶ÔÕâЩÎļþÖеÄÅäÖòÎÊý¸³ÓèÊʵ±µÄÖµ¡£ÓÉ configure ´´½¨Éú³ÉµÄÎļþÓУº

    1¡£Ò»¸ö»ò¶à¸ö Makefile£¬ÔÚÈí¼þÔ´´úÂëµÄÿ¸öĿ¼Öж¼Éú³ÉÒ»¸ö Makefile¡£

    2¡£»¹¿ÉÑ¡µÄÉú³É C Í·Îļþ¡ª¡ªconfigurable£¬°üº¬Á˸÷ÖÖ #define ÉùÃ÷¡£

    3¡£Ò»¸öÃûΪ config.status µÄ½Å±¾£¬µ±ÔËÐÐʱ£¬ÖØÐÂÉú³ÉÉÏÃæµÄÎļþ¡£

    4¡£Ò»¸öÃûΪ config.cache µÄ½Å±¾£¬±£´æÔËÐмì²âµÄ½á¹û¡£

    5¡£Ò»¸öÃûΪ config.log µÄÎļþ£¬±£´æÓбàÒëÆ÷Éú³ÉµÄÐÅÏ¢£¬ÓÃÓÚµ÷ÊÔ configure¡£

ΪÁËÈà autoconf Éú³É configure ½Å±¾£¬ÐèÒªÒÔ configure.in Ϊ²ÎÊýµ÷Óà autoconf¡£Èç¹ûÒª¼ì²â×Ô¼ºµÄ¸÷ÖÖ²ÎÊý£¬ÒÔ×÷Ϊ¶Ô autoconf µÄ²¹³ä£¬ÔòÐèҪд aclocal.m4 ºÍ acsite.m4 µÄÎļþ¡£Èç¹ûҪʹÓà C Í·Îļþ£¬ÐèҪд acconfig.h£¬²¢ÇÒ½« autoconf Éú³ÉµÄ config.h.in ͬÈí¼þÒ»Æð·¢ÐС£

your source files --> [autoscan*] --> [configure.scan] --> configure.in


configure.in --. .------> autoconf* -----> configure

                   +---+

[aclocal.m4] --+   `---.

[acsite.m4] ---'       |

                      +--> [autoheader*] -> [config.h.in]

[acconfig.h] ----.     |

                 +-----'

[config.h.top] --+

[config.h.bot] --'


Makefile.in -------------------------------> Makefile.in

Files used in configuring a software package:

                       .-------------> config.cache

configure* ------------+-------------> config.log

                       |

[config.h.in] -.       v            .-> [config.h] -.

               +--> config.status* -+               +--> make*

Makefile.in ---'                    `-> Makefile ---'


±à¼­ configure.in Îļþ£º

configure.in ÎļþÖаüº¬ÁË¶Ô autoconf ºêµÄµ÷Óã¬ÕâЩºêÊÇÓÃÀ´¼ì²âÈí¼þËù±ØÐëµÄ¸÷Ïî²ÎÊýµÄ¡£ÎªÁËÄܹ»µÃµ½ configure.in Îļþ£¬ÐèҪʹÓà autoscan¡£configure.in ÎļþÖУ¬ÔÚ½øÐи÷Ïî¼ì²âǰ£¬±ØÐëÔÚ×ʼµ÷Óà AC_INIT£¬ÔÚ×îºóµ÷Óà AC_OUTPUT¡£ÁíÍâÓÐЩºêÓÉÓÚ¼ì²âµÄ¹ØÏµÊǺÍÔÚÎļþÖеÄλÖÃÏà¹ØµÄ¡£×îºÃÿһ¸öºêÕ¼ÓÃÒ»ÐС£


ʹÓà autoscan ´´½¨ configure.in Îļþ

¿ÉÒÔ½«Ä¿Â¼×öΪ²ÎÊýµ÷Óà autoscan£¬Èç¹û²»Ê¹ÓòÎÊýµÄ»¯£¬ÔòÈÏΪÊǵ±Ç°Ä¿Â¼¡£autoscan ½«¼ì²éÖ¸¶¨Ä¿Â¼ÖеÄÔ´Îļþ£¬²¢´´½¨ configure.scan Îļþ¡£ÔÚ½« configure.scan ¸ÄÃûΪ configure.in Îļþǰ£¬ÐèÒªÊÖ¹¤¸Ä¶¯ËüÒÔ½øÐе÷Õû¡£


ʹÓà autoconf ´´½¨ configure ½Å±¾

²»´øÈκβÎÊýµÄÔËÐÐ autoconf¡£autoconf ½«Ê¹Óà m4 ºê´¦ÀíÆ÷ºÍ autoconf ºê£¬À´´¦Àí´¦Àí configure.in Öеĺꡣ


configure.in Öеĺ꣺

    AC_INIT£¨ÔÚÔ´´úÂëÖÐΨһµÄÒ»¸öÎļþ£©£ºconfigure ½«¼ì²é¸ÃÎļþÊÇ·ñ´æÔÚ£¬²¢¼ì²é°üº¬ËüµÄĿ¼ÊÇ·ñ´æÔÚ¡£

    AC_OUTPUT£¨Îļþ£©£ºÖ¸¶¨´´½¨µÄÊä³öÎļþ¡£ÔÚ configure.in ÎļþÖе÷ÓÃÒ»´Î¡£ÎļþÃû¼äÓÿոñ·Ö¿ª¡£±ÈÈ磺AC_OUTPUT(Makefile:templates/top.mk lib/Makefile:templates/lib.mk)

ÔÚ configure.in ÖУ¬ÓÐһЩ±» autoconf ºêÔ¤Ïȶ¨ÒåµÄ±äÁ¿£¬ÖØÒªµÄÓÐÈçϼ¸¸ö£º

    bindir£º°²×°¿ÉÖ´ÐÐÎļþµÄĿ¼¡£

    includedir£ºC Í·ÎļþĿ¼¡£

    infodir£ºinfo Ò³°²×°Ä¿Â¼¡£

    mandir£º°²×°ÊÖ²áÒ³µÄĿ¼¡£

    sbindir£ºÎª¹ÜÀíÔ±ÔËÐиøóÌÐòÌṩµÄ°²×°Â·¾¶¡£

    srcdir£ºÎª Makefile ÌṩµÄÔ´´úÂë·¾¶¡£

    top_srcdir£ºÔ´´úÂëµÄ×îÉϲãĿ¼¡£

    LIBS£º¸øÁ¬½Ó³ÌÐòµÄ -l Ñ¡Ïî

    LDFLAGS£º¸øÁ¬½Ó³ÌÐòµÄ stripping£¨-s£©ºÍÆäËûһЩѡÏî¡£

    DEFS£º¸ø C ±àÒëÆ÷µÄ -D Ñ¡Ïî¡£

    CFLAGS£º¸ø C ±àÒëÆ÷µÄ debug ºÍÓÅ»¯Ñ¡Ïî¡£µ±µ÷ÓÃÁË AC_PROG_CC ²ÅÓÐЧ¡£

    CPPFLAGS£ºÍ·ÎļþËÑË÷·¾¶£¨-I)ºÍ¸ø C Ô¤´¦ÀíÆ÷ºÍ±àÒëÆ÷µÄÆäËûÑ¡Ïî¡£

    CXXFLAGS£º¸ø C++ ±àÒëÆ÷µÄ debug ºÍÓÅ»¯Ñ¡Ïî¡£µ±µ÷ÓÃÁË AC_PROG_CXX ²ÅÓÐЧ¡£

Èç¹ûÔÚͬһ¸öĿ¼Ï±àÒë¶à¸ö³ÌÐòµÄ»°£¬Ê¹Óà AC_CONFIG_SUBDIRS ºê£¬ËüµÄÓï·¨ÊÇ£º

    AC_CONFIG_SUBDIRS(DIR....)£º

ÆäËûÖØÒªµÄºê£º

    AC_PROG_CC£ºÑ¡Ôñ C ±àÒëÆ÷¡£Èç¹ûÔÚ»·¾³Öв»ÉèÖà CC µÄ»°£¬Ôò¼ì²â gcc¡£

    AC_PROG_CXX£ºÑ¡Ôñ C++ ±àÒëÆ÷¡£

²Î¿¼ÎÄÏ×£º

    Autoconf.htm
2.3 ʹÓà automake
Ò»°ã²Ù×÷

    Automake ¹¤×÷ʱ£¬¶Áȡһ¸ö½Ð'Makefile.am'µÄÎļþ£¬²¢Éú³ÉÒ»¸ö'Makefile.in'Îļþ¡£Makefile.amÖж¨ÒåµÄºêºÍÄ¿±ê,»áÖ¸µ¼automakeÉú³ÉÖ¸¶¨µÄ´úÂë¡£ÀýÈ磬ºê'bin_PROGRAMS'½«µ¼Ö±àÒëºÍÁ¬½ÓµÄÄ¿±ê±»Éú³É¡£

    Makefile.amÖаüº¬µÄÄ¿±êºÍ¶¨ÒåµÄºê±»¿½±´µ½Éú³ÉµÄÎļþÖÐÈ¥£¬ÕâÔÊÐíÄãÌí¼ÓÈÎÒâ´úÂëµ½Éú³ÉµÄMakefile.inÎļþÖÐÈ¥¡£ÀýÈ磬ʹһ¸öAutomake·¢²¼Öаüº¬Ò»¸ö·Ç±ê×¼µÄdvs-distÄ¿±ê£¬AutomakeµÄά»¤ÕßÓÃËüÀ´´ÓËüµÄÔ´Âë¿ØÖÆÏµÍ³ÖÆ×÷Ò»¸ö·¢²¼¡£

    Çë×¢Ò⣬GNUÉú³ÉµÄÀ©Õ¹Ãû²»±»AutomakeËùʶ±ð£¬ÔÚÒ»¸ö'Makefile.am'ÖÐʹÓÃÕâÑùÒ»¸öÀ©Õ¹Ãû»áµ¼Ö´íÎó¡£

    AutomakeÊÔͼÒÔÒ»ÖÖ´ÏÃ÷µÄ·½Ê½½«ÏàÁÚµÄÄ¿±ê£¨»ò±äÁ¿¶¨Ò壩עÊÍÖØ×é¡£

    ͨ³£,Makefile.amÖж¨ÒåµÄÄ¿±ê»á¸²¸ÇÈκÎÓÉautomake×Ô¶¯Éú³ÉµÄÓÐÏàËÆÃû×ÖµÄÕâÑùµÄÄ¿±ê¡£¾¡¹ÜÕâÊÇÖÖ±»Ö§³ÖµÄÊôÐÔ£¬µ«×îºÃ±ÜÃâÕâô×ö£¬ÒòΪÓÐЩʱºò£¬Éú³ÉµÄ¹æÔòºÜÑϸñ¡£

    ÀàËÆµÄ£¬Makefile.amÖж¨ÒåµÄ±äÁ¿»á¸²¸ÇÈκÎÓÉautomake×Ô¶¯Éú³ÉµÄ±äÁ¿¶¨Òå¡£ÕâÒ»ÌØÐÔ¾­³£Òª±ÈÄ¿±ê¶¨ÒåµÄ¸²¸ÇÄÜÁ¦¸ü³£Óá£Çë×¢Ò⣬ºÜ¶àautomakeÉú³ÉµÄ±äÁ¿Ö»ÓÃÓÚÄÚ²¿Ê¹Óã¬ÔÚ½«À´·¢²¼Ê±ËûÃǵÄÃû×Ö¿ÉÄÜ»á±ä»¯¡£

    µ±²âÊÔÒ»¸ö±äÁ¿¶¨Òåʱ£¬Automake½µµÝ¹éµÄ²âÊÔÔÚ¶¨ÒåÖÐÒýÓõıäÁ¿¡£ÀýÈ磬Èç¹ûAutomake¿´µ½Õâ¶Îsnippet³ÌÐòÖеÄ'foo_SOURCES'£º

    xs = a.c b.c

    foo_SOURCES = c.c $(xs)

    Ëü½«Ê¹ÓÃÎļþ£º'a.c','b.c'ºÍ'c.c' ×÷Ϊfoo_SOURCESµÄÄÚÈÝ.

    Automake Ò²ÔÊÐí²»±»¿½±´µ½Êä³öµÄ×¢ÊÍÐÎʽ,ËùÓÐÒÔ'##'¿ªÍ·µÄÐн«±»Automake ÍêÈ«ºöÂÔ.


Éî¶È

    Automake Ö§³ÖÈýÖÖĿ¼²ã´Î:'flat', 'shallow', 'deep'.

    flat: ËùÓеÄÎļþ¶¼ÔÚÒ»¸öĿ¼ÖÐ. ÏàÓ¦µÄMakefile.amÖÐȱÉÙSUBDIRSºê. termutils ÊÇÒ»¸öÀý×Ó.

    deep: ËùÓеÄ×ÊÔ´¶¼ÔÚ×ÓĿ¼ÖÐ,Ö¸¶¨ÔøÄ¿Â¼Ö÷Òª°üº¬ÅäÖÃÐÅÏ¢.GNU cpio ÊÇÒ»¸öºÜºÃµÄÀý×Ó.GNU tar.ÏàÓ¦µÄ×î¶¥²ãMakefile.amÖн«°üº¬Ò»¸öSUBDIRºê,µ«Ã»ÓÐÆäËûµÄºêÀ´¶¨ÒåÒª´´½¨µÄ¶ÔÏó.

    shallow: Ö÷×ÊÔ´´æÔÚÓÚ×î¶¥²ãĿ¼,¶ø²»Í¬µÄ²¿·Ö(µäÐ͵Ä,¿âº¯Êý)ÔÚ×ÓĿ¼ÖÐ.Automake ¾ÍÊÇÕâÑùµÄÒ»¸ö°ü.


ÑϸñÐÔ

    µ±Automake ±»GNU°üά»¤ÕßʹÓÃʱ,ËüµÄȷŬÁ¦È¥ÊÊÓ¦,µ«²»ÒªÊÔͼʹÓÃËùÓеÄGNU¹ßÀý.

    Ŀǰ,Automake Ö§³ÖÈýÖÖÑϸñÐÔ±ê×¼:

    foreign:Automake ½«Ö»¼ì²é¾ø¶Ô±ØÐëµÄ¶«Î÷.

    gnu:Automake ½«¾¡¿ÉÄܶàµÄ¼ì²éÒÔÊÊÓ¦GNU±ê×¼, ÕâÊÇĬÈÏÏî.

    gnits:Automake ½«½øÐмì²é£¬ÒÔÊÊÓ¦¡°ÉÐδ³ÉÎÄ¡±µÄGnits±ê×¼¡£ ËûÃÇ»ùÓÚGNU±ê×¼£¬µ«¸üÏ꾡¡£³ý·ÇÄúÊÇGnits±ê×¼µÄÖÆ¶¨Õß¡£½¨ÒéÄú×îºÃ±ÜÃâÕâ¸öÑ¡Ïָµ¼¸Ã±ê×¼Õýʽ·¢²¼¡£


ͳһÃüÃû¹æ·¶

    Automake±äÁ¿Ò»°ã×ñÑ­Ò»Ì×ͳһµÄÃüÃû¹æ·¶ÒÔºÜÈÝÒ׵ľö¶¨ÈçºÎ´´½¨ºÍ°²×°³ÌÐò£¨ºÍÆäËûÅÉÉú¶ÔÏ󣩡£¸ø¹æ·¶»¹Ö§³Öconfigureʱ¶¯Ì¬¾ö¶¨´´½¨¹æÔò¡£

    ÔÚmakeʱ£¬Ò»Ð©±äÁ¿±»ÓÃÓÚ¾ö¶¨ÄÇЩ¶ÔÏóÒª±»´´½¨¡£Ð´±äÁ¿½Ð×öprimary variables¡£ÀýÈ磬PROGRAM±äÁ¿°üÀ¨Ò»¸öÒª±»±àÒëºÍÁ¬½ÓµÄ³ÌÐòÁÐ±í¡£

    ÁíÒ»¸ö±äÁ¿¼¯ÓÃÓÚ¾ö¶¨±»´´½¨±äÁ¿±»°²×°µ½ÄÄÀï¡£ÕâЩ±äÁ¿ÒÔÏàÓ¦µÄÖ÷±äÁ¿ÃüÃû£¬µ«¼ÓÒ»¸öǰ׺£¬±íʾÄÇЩ±ê׼Ŀ¼Ӧ±»ÓÃ×÷°²×°Â·¾¶¡£ÕâЩ±ê׼Ŀ¼µÄÃû³Æ¹æ¶¨ÔÚGNU±ê×¼ÖС£AutomakeÓÃpkglibdir£¬ pkgincludedir ºÍ pkgdatadirÀ´Õ¹¿ªÕâÒ»ÁÐ±í¡£ËûÃǺÍûÓÐpkgǰ׺µÄ°æ±¾Ò»Ñù£¬Ö»²»¹ýÓС®@PACHAGE@¡¯À©Õ¹£¬PKGLIBDIR±»¶¨ÒåΪ $(DATADIR)/@PACKAGE@.

    ¶Ôÿһ¸öÖ÷±äÁ¿£¬ÓÐÒ»¸öEXTRA_ǰ׺µÄ±äÁ¿¡£Õâ¸ö±äÁ¿ÓÃÓÚÁгöËùÓжÔÏó£¬ÖÁÓÚÄÄЩ±äÁ¿±»´´½¨£¬ÄÄЩ±äÁ¿²»±»´´½¨ÔòÈ¡¾öÓÚconfigure¡£Ö®ËùÒÔÐèÒªÕâ¸ö±äÁ¿£¬ÊÇÒòΪAutomake±ØÐ뾲̬µÄÖ¸µ¼Òª´´½¨¶ÔÏóµÄÍêÕûÁбíÒÔ±ãÉú³ÉÒ»¸ö¡®Makefile¡£in¡¯Îļþ¡£

    ÀýÈ磬cpio ÔÚconfigureʱ¾ö¶¨´´½¨ÄÇЩ³ÌÐò¡£Ò»Ð©³ÌÐò±»°²×°ÔÚbindir£¬Ò»Ð©±»°²×°ÔÚsbindir£º

    EXTRA_PROGRAMS = mt rmt

    bin_PROGRAMS = cpoi pax

    sbin_PRGRAMS = @PROGRAMS@

    ¶¨ÒåûÓÐǰ׺µÄÖ÷±äÁ¿ÊÇ´íÎóµÄ£¨È磺PROGRAMS£©¡£ÖµµÃ×¢ÒâµÄÊÇ£¬¡°dir¡±ÔÚ×÷Ϊ¹¹³É±äÁ¿Ãûʱ»á±»ºöÂÔ¡£Ò»´Î£¬ÎÒÃÇд³Ébin_PROGRAMS ¶ø²»ÊÇbindir_PROGRAMS.

    ²»ÊÇÿһÖÖ¶ÔÏó¶¼µÃÒÔ°²×°ÔÚÿ¸öĿ¼Ï¡£Automake ½«±ê¼ÇÄÇЩËûÈÏΪÊÇ´íÎóµÄ³¢ÊÔ£¬ËûÒ²Äܹ»Õï¶ÏһЩÃ÷ÏÔµÄĿ¼Ãûƴд´íÎó¡£

    ÓÐʱ±ê׼Ŀ¼--±»AutomakeʹÓõÄ--²»¹ýÓá£ÌرðµÄ£¬ÓÐʱΪÁËÇåÎú£¬½«¶ÔÏó°²×°ÔÚһЩԤ¶¨ÒåµÄ×ÓĿ¼£¬ÊǺÜÓÐÓõġ£AutomakeÔÊÐíÄãÔö¼Ó°²×°Ä¿Â¼¡£Èç¹ûÒÔÒ»¸ö±äÁ¿Ãû£¨È磬zar£©¼ÓÉÏdirµÄÁíÒ»¸ö±äÁ¿£¨È磬zardir£©±»¶¨ÒåÁË£¬ÄÇôËûÒ²ÊǺϷ¨µÄ¡£

    ÀýÈ磬Èç¹ûHTMLû֧³ÖAutomakeµÄһϲ¿·Ö£¬Äã¾Í¿ÉÒÔÓÃËûÀ´°²×°HTMLÔ´Îļþ£º

    htmldir = $(prefix)/html

    html_DATA = automake.html

    ¡°noinst¡±Ç°×º×¨ÃÅÖ¸¶¨ÓÐÎÊÌâµÄ¶ÔÏó²»±»°²×°¡£

    ¡°check¡±Ç°×º±íʾÓÐÎÊÌâµÄ¶ÔÏóÖªµÀmake checkÃüÁî±»Ö´Ðв±»´´½¨¡£

    ¿ÉÓõÄÖ÷±äÁ¿ÊÇ 'PROGRAMS','LIBRARIES','LISP','SCRIPTS','DATA','HEADERS','MANS'ºÍ'TEXINFOS' µ¼³ö±äÁ¿ÊÇÈçºÎÃüÃûµÄ

    ÓÐʱһ¸öMakefile±äÁ¿ÃûÓÐһЩÓû§Ö§³ÖµÄÎı¾µ¼³ö¡£ÀýÈç³ÌÐòÃû±»ÖØÐ´½øMakefileºêÃû³Æ¡£Automake¶ÁÈ¡ÕâЩÎı¾£¬ËùÒÔËû²»±Ø×ñÑ­ÃüÃû¹æÔò¡£µ±Éú³ÉºóÒýÓÃʱÃû³ÆÖеÄ×Ö·û³ýÁË×Öĸ£¬Êý×Ö£¬Ï»®Ïß¶á»Ø±»×ª»»ÎªÏ»®Ïß¡£ÀýÈ磬Èç¹ûÄãµÄ³ÌÐòÀïÓÐsniff-glue,Ôòµ¼³ö±äÁ¿Ãû½«»áÊÇsniff_glue_SOURCES,¶ø²»ÊÇsniff-glue_SOURCES.


һЩÀý×Ó


Ò»¸öÍêÕû¼òµ¥µÄÀý×Ó

    ¼ÙÉèÄãдÁËÒ»¸öÃûΪzardozµÄ³ÌÐò¡£

    µÚÒ»²½£¬¸üÐÂÄãµÄconfigure.inÎļþÒÔ°üº¬automakeËùÐèµÄÃüÁî¡£×î¼òµ¥µÄ°ì·¨¾ÍÊÇÔÚAC_INITºó¼ÓÒ»¸öAM_INIT_AUTOMAKEµ÷Óãº

    AM_INIT_AUTOMAKE(zardoz, 1.0)

    Èç¹ûÄãµÄ³ÌÐòûÓÐÈκθ´ÔÓµÄÒòËØ¡£ÕâÊÇ×î¼òµ¥µÄ°ì·¨¡£

    ÏÖÔÚ£¬Äã±ØÐëÖØ½¨¡®configure¡¯Îļþ¡£ÕâÑù×ö£¬Äã±ØÐë¸æËßautoconfÈçºÎÕÒµ½ÄãËùÓõÄкꡣ×î¼òµ¥µÄ·½Ê½ÊÇʹÓÃaclocal³ÌÐòÀ´ Éú³ÉÄãµÄ¡®aclocal.m4¡¯.aclocalÈÃÄ㽫ÄãµÄºê¼Ó½ø¡®acincluide.m4¡¯,ËùÒÔÄãÖ»ÐèÖØÃüÃû²¢ÔËÐÐËû


    mv aclocal.m4 acinclude.m4

    aclocal

    autoconf


    ÏÖÔÚÊÇΪÄãµÄzardozдMakefile.amµÄʱºòÁË¡£zardozÊÇÒ»¸öÓû§³ÌÐò£¬ËùÒÔÄæÏò½«Ëû°²×°ÔÚÆäËûÓû§³ÌÐò°²×°µÄĿ¼¡£zardoz»¹ÓРһЩTexinfoÎĵµ¡£ÄãµÄconfigure.in½Å±¾Ê¹ÓÃAC_REPLACE_FUNCS£¬ËùÒÔÄãÐèÒªÁ´½Ó¡®@LIBOBJS@¡¯

    bin_PROGRAMS = zardoz

    zardoz_SOURCES = main.c head.c float.c vortex9.c gun.c

    zardoz_LDADD = @LIBOBJS@


    info_TEXINFOS = zardoz.texi


    ÏÖÔÚÄã¿ÉÒÔÔËÐÐAutomakeÒÔÉú³ÉÄãµÄMakefile.inÎļþ¡£

Ò»¸ö¾­µäµÄ³ÌÐò

    hello ÒÔÆä¼òµ¥ºÍ¶àÃæÐÒ¶øÎÅÃû¡£×ÅÒ»¶Î½«ÏÔʾÔÚHello°üAutomakeÈçºÎ±»Ê¹Óá£

    ÏÂÃæÊÇ

    dnlÓà autoconf ´¦ÀíËüÒÔ²úÉúÒ»¸ö configure ½Å±¾.

    AC_INIT(src/hello.c)

    AM_INIT_AUTOMAKE(hello, 1.3.11)

    AM_CONFIG_HEADER(config.h)


    dnl Set of available languages

    ALL_LINGUAS="de fr es ko nl no pl pt sl sv"

    dnl Checks for programs.

    AC_PROG_CC

    AC_ISC_POSIX

    dnl Checks for libraries.

    dnl Checks for header files.

    AC_STDC_HEADERS

    AC_HAVE_HEADERS(string.h fcntl.h sys/file.h sys/param.h)

    dnl Checks for library functions.

    AC_FUNC_ALLOCA

    dnl Check for st_blksize in struct stat

    AC_ST_BLKSIZE

    dnl internationalization macros

    AM_GNU_GETTEXT

    AC_OUTPUT([Makefile doc/Makefile intl/Makefile po/Makefile.in \ src/Makefile tests/Makefile tests/hello], [chmod +x tests/hello])

    'AM_'ºêÓÉAutomake£¨»òGettext ¿â£©Ìṩ£»ÆäÓàµÄÊÇAutoconf±ê×¼ºê¡£

    top-level ¡®Makefile.am¡¯:

    EXTRA_DIST = BUGS ChangeLog.O

    SUBDIRS = doc intl po src tests

    --ÈçÄãËù¼û,ÕâÀïËùÓеŤ×÷ʱÔÚ×ÓĿ¼ÖÐÕæÕýÍê³ÉµÄ.

    --'po' ºÍ 'intl'Ŀ¼ÊÇÓà gettextize×Ô¶¯Éú³ÉµÄ,ÕâÀï²»×ö½øÒ»²½ÌÖÂÛ.

    ÔÚ'doc/Makefile.am'ÎļþÖÐÎÒÃÇ¿´µ½:

    info_TEXINFOS = hello.texi

    hello_TEXINFOS = gpl.texi

    --ÕâÒÑ×ãÒÔ´´½¨,°²×°ºÍ·¢²¼ÊÖ²á.


    ÕâÀïÊÇ'tests/Makefile.am'Îļþ:

    TESTS = hello

    EXTRA_DIST = hello.in testdata

    --½Å±¾'hello'±»configure´´½¨,²¢ÇÒÊÇΨһµÄ²âÊÔ.make check½«ÔËÐÐËü.

    ×îºóÊÇ,'src/Makefile.am',ËùÓеÄÕæÕýµÄ¹¤×÷ÊÇÔÚÕâÀïÍê³ÉµÄ:

    bin_PROGRAMS = hello

    hello_SOURCES = hello.c version.c getopt.c getopt1.c getopt.h system.h

    hello_LDADD = @INTLLIBS@ @ALLOCA@

    localedir = $(datadir)/locale

    INCLUDES = -I../intl -DLOCALEDIR=\"$(localedir)\"


´´½¨Ò»¸ö'Makefile.in'Îļþ

    ҪΪһ¸ö°ü´´½¨ËùÓеÄ'Makefile.in',ÔÚ¶¥²ãĿ¼ÔËÐÐautomake²»´ø²ÎÊýµÄ³ÌÐò.automake½«×Ô¶¯²éÕÒÿ¸öÊʵ±µÄ'Makefile.am'Îļþ,²¢Éù³ÆÏàÓ¦µÄ'Makefile.in'Îļþ.Çë×¢Òâ,automake»á¼òÒªµÄ²ì¿´Ò»Ï°üµÄ¹¹³É;Ëü¼Ù¶¨Ò»¸ö°üÔÚ¶¥²ãÖ»ÓÐÒ»¸ö'configure.in'Îļþ.Èç¹ûÄãµÄ°üÓжà¸ö'configure.in'Îļþ,ÄÇôÄã±ØÐëÔÚÿһ¸öº¬ÓÐ'configure.in'ÎļþµÄĿ¼ÔËÐÐÒ»´Î'automake'³ÌÐò.

    Äã¿ÉÒÔËæÒâË͸øautomakeÒ»¸ö²ÎÊý;'.am'»á¼Óµ½±äÁ¿ÃûµÄºóÃæ,²¢ÇÒ×÷ΪÊäÈëÎļþµÄÎļþÃû.ÕâÒ»ÌØÐÔͨ³£±»ÓÃÀ´×Ô¶¯Öؽ¨Ò»¸ö'¹ýʱµÄ''Makefile.in'Îļþ.×¢Òâ,automake±ØÐëÔÚ×î¶¥¼¶µÄĿ¼ÔËÐÐ,¼°Ê±½ö½öΪÁËÖØÐÂÉú³Éij¸ö×ÓĿ¼ÖеÄ'Makefile.in'Îļþ.

automake½ÓÊÜÒÔÏ¿ÉÑ¡²ÎÊý:

    -a

    --add-missing

    ÔÚÄ³Ð©ÌØÊâÇé¿öÏÂ,AutomakeÐèҪijЩ¹«¹²Îļþ´æÔÚ.ÀýÈç,Èç¹û'configure.in'ÔËÐÐ AC_CANONICAL_HOSTʱ,¾ÍÐèÒª'config.guess'.AutomakeÐèÒª¼¸¸öÕâÑùµÄÎļþ,ÕâһѡÏî»áÈÃautomake×Ô¶¯µÄ½«Ò»Ð©È±Ê§Îļþ¼Ó½ø°üÖÐ(Èç¹û¿ÉÄܵϰ).Ò»°ãµÄ,Èç¹ûAutomake¸æËßÄãij¸öÎļþ²»´æÔÚ,Äã¿ÉÒÔÊÔÒ»ÊÔÕâ¸öÑ¡Ïî.

    --amdir = dir

    ÔÚdirËùÖÆ¶¨µÄĿ¼¶ø²»Êǰ²×°Ä¿Â¼ÏÂѰÕÒAutomakeµÄÊý¾ÝÎļþ,¾­³£ÓÃÓÚµ÷ÊÔ.

    --build-dir = dir

    ¸æËßAutomake´´½¨Ä¿Â¼ÔÚÄÄÀï.ÕâһѡÏîÖ»ÓÃÓÚ½«'dependencies'¼Ó½øÒ»¸öÓÉmake distÉú³ÉµÄ'Makefile.in'ÎļþÖÐ.

    --cygnus

    ½«Ê¹µÃËùÉú³ÉµÄ'Makefile.in'Îļþ×ñÑ­Cygnus¹æÔò,¶ø²»ÊÇGNU»òGnits¹æÔò.

    --foreign

    ÉèÖÃÈ«¾ÖÑϸñÐÔΪ'gnits'.

    --gnu

    ÉèÖÃÈ«¾ÖÑϸñÐÔΪ'gnu'.

    --help

    °ïÖú

    -i

    --include-deps

    ½«ËùÓÐ×Ô¶¯´´½¨Ê±µÄÒÀÀµÐÅÏ¢°üÀ¨ÔÚ'Makefile.in'ÖÐ.ͨ³£ÔÚÖÆ×÷·¢ÐÐʱÓõ½.

    --generate-deps

    ´´½¨Ò»¸ö'.dep_segment'Îļþ,ËüºÏ²¢ÁËËùÓеÄ×Ô¶¯Éú³ÉʱµÄÒÀÀµÐÅÏ¢,ͨ³£ÓÃÓÚÖÆ×÷·¢ÐÐ.ÕâÔÚά»¤'SMakefile'»òÆäËûƽ̨ÉϵÄ'Makefile'(ÈçMakefile.Dos)ʱ·Ç³£ÓÐÓÃ.ËüÖ»ÄÜÓë--include-deps, --srcdir-nameºÍ --build-dir ÁªºÏʹÓÃ.×¢ÒâÕâһѡÏî²»×÷ÆäËûÈκδ¦Àí.

    --no-force

    Ò»°ãµÄ,automake´´½¨ÔÚ'configure.in'ÖÐÌá¼°µÄËùÓÐ'Makefile.in'Îļþ.ÕâһѡÏµ¼ÖÂ,automakeÖ»¸üÐÂÄÇЩ¶ÔÓÚÓë×ÔÉíÏà¹ØµÄ¶«Î÷¹ýÁËʱµÄ'Makefile.in'Îļþ.

    -o dir

    --output-dir = dir

    ½«Éú³ÉµÄ'Makefile.in'·ÅÔÚÖ¸¶¨µÄdirĿ¼ÖÐ.ͨ³£,'Makefile.in'·ÅÔÚÓëÖ®Ïà¶ÔÓ¦µÄ'Makefile.am'ËùÔÚĿ¼ÖеÄ.ÔÚÖÆ×÷·¢²¼Ê±Ê¹ÓÃ.

    --srcdir-name = dir

    ¸æËßAutomakeÓ뵱ǰ´´½¨¶¯×÷Ïà¹ØµÄÔ´ÎļþĿ¼µÄÃû×Ö.¸öÑ¡Ïî½ö±»ÓÃÓÚ½«×Ô¶¯´´½¨Ê±µÄÒÀÀµÐÅÏ¢°üÀ¨ÔÚ'Makefile.in'ÖÐ.

    -v

    --verbose

    ʱAutomake´òÓ¡³öÕýÔÚ¶ÁÈ¡»ò´´½¨µÄÎļþµÄÐÅÏ¢.

    --version

    ´òÓ¡AutomakeµÄ°æ±¾ºÅ.


ɨÃè'configure.in'Îļþ

    AutomakeɨÃè°üµÄ'configure.in'ÎļþÀ´¾ö¶¨Ä³Ð©¹ØÓÚ°üµÄÐÅÏ¢.'configure.in'ÖбØÐ붨ÒåһЩ±äÁ¿²¢ÇÒÐèҪһЩautoconf ºê.AutomakeÒ²»áÀûÓÃ'configure.in'ÎļþµÄÐÅÏ¢À´¶¨ÖÆËüµÄÊä³ö.

    Automake»¹Ö§³ÖһЩautoconfºêÒÔʹά»¤¸üΪ¼òµ¥.


ÅäÖÃÐèÇó

    Âú×ãAutomake»ù±¾ÒªÇóµÄ×î¼òµ¥·½·¨ÊÇʹÓÃ'AM_INIT_AUTOMAKE'ºê.µ«Èç¹ûÄãÔ¸Òâ,Äã¿ÉÒÔÊÖ¹¤À´×ö.


×Ô¶¯Éú³É aclocale.m4

    Automake°üÀ¨ºÜ¶àAutoconfºê,ÆäÖÐÓÐЩÔÚijЩÇé¿öÏÂÓÎAutomakeʹÓÃ,ÕâЩºê±ØÐë±»¶¨ÒåÔÚÄãµÄ'aclocal.m4'ÖÐ.·ñÔò,autoconf½«¿´²»µ½ËûÃÇ.

    acloal³ÌÐò½«¸ù¾Ý'configure.in'×Ô¶¯Éú³É'aclocal.m4'.ÕâÌṩÁËÒ»¸ö·½±ãµÄ;¾¶À´µÃµ½AutomakeÌṩµÄºê.


AutomakeËùÖ§³ÖµÄAutoconfºê

    AM_CONFIG_HEADER

    AM_CYGWIN32

    AM_FUNC_STRTOD

    AM_FUNC_ERROR_AT_LINE

    AM_FUNC_MKTIME

    AM_FUNC_OBSTACK

    AM_C_PROTOTYPES

    AM_HEADER_TOCGWINSZ_NEEDS_SYS_IOCTL

    AM_INIT_AUTOMAKE

    AM_PATH_LISPDIR

    AM_PROG_CC_STDC

    AM_PROG_INTALL

    AM_PROG_LEX

    AM_SANITY_CHECK

    AM_SYS_POSIX_TERMIOS

    AM_TYPE_PTRDIFF_T

    AM_WITH_DMALLOC

    AM_WITH_REGEX


±àдÄã×Ô¼ºµÄaclocalºê

    Aclocal²¢Ã»ÓÐÌØ¶¨µÄºê»úÖÆ,Òò´ËÄã¿ÉÒÔÓÃÄã×Ô¼ºµÄºêÀ´À©Õ¹Ëü.ÕâÒÔÌØÐÔ¾­³£±»ÓÃÒÔÖÆ×÷×öÄÇЩÏëÈÃ×Ô¼ºµÄAutoconfºê±»ÆäËûÓ¦ÓóÌÐòʹÓõĿâ.ÀýÈç,gettext¿âÖ§³ÖÒ»¸öAM_GNU_GETTEXTºê,Ëü¿ÉÒÔ±»ÈκÎʹÓÃgettext¿âµÄ°üËùʹÓÃ.µ±¸Ã¿â±»°²×°ºó,Ëü»á°²×°Õâ¸öºê,ÕâÑù,aclocal¾ÍÄܹ»ÕÒµ½ËûÁË.

    ºêµÄÃû³ÆÓ¦ÒÔ'.m4'½áβ,ÕâÑùµÄÎļþ½«±»°²×°ÔÚ'$(datadir)/aclocal'ÖÐ.


×î¶¥²ã'Makefile.am'

    ÔÚnon-flat°üÖÐ,¶¥²ã'Makefile.am'±ØÐë¸æËßAutomakeÄÄЩ×ÓĿ¼½«±»´´½¨.ÕâÊÇͨ¹ýSUBDIRS±äÁ¿¶¨ÒåµÄ.

    SUBDIRSºê°üº¬Ò»¸ö×ÓĿ¼Áбí,ÒԹ涨¸÷ÖÖ´´½¨µÄ¹ý³Ì.'Makefile'ÖкܶàÄ¿±ê(Èç,all)½«²»Ö¹ÔËÐÐËùÔÚĿ¼ÖÐ,»¹ÒªÔËÐÐÓÚËùÓÐÖ¸¶¨µÄ×ÓĿ¼ÖÐ.×¢Òâ,ÔÚSUBDIRSÖÐÁгöµÄĿ¼²¢²»ÐèÒª°üº¬'Makefile.am'Îļþ¶øÖ»ÐèÒª'Makefile'Îļþ.Õ⽫ÔÊÐí°üº¬Î»ÓÚ²»Ê¹ÓÃAutomakeµÄ°ü(Èç,gettext)ÖеĿâ.ÁíÍâ,SUBDIRSÖ®ÖеÄĿ¼±ØÐëÊǵ±Ç°Ä¿Â¼µÄÖ±½Ó×ÓĿ¼.±ÈÈç,Äã²»ÄÜÔÚSUBDIRSÖÐÖ¸¶¨'src/subdir'.

    ÔÚdeepÐ͵İüÖÐ,¶¥²ã'Makefile.am'Îļþͨ³£·Ç³£¶Ì.ÀýÈç,ÏÂÃæÊÇHELLO·¢²¼ÖеÄ'Makefile.am':


    EXTRA_DIST = BUGS ChangeLog.O README-alpha

    SUBDIRS = doc intl po src tests


    Èç¹ûÄãÖ»Ïë´´½¨Ò»¸ö°üµÄ×Ó¼¯,Äã¿ÉÒÔ¸²¸ÇSUBDIRS(¾ÍÈçͬGNU inetutilsµÄÇéÐÎ)ÔÚÄãµÄ'Makefile.am'ÖаüÀ¨:

    SUBDIRS = @SUBDIRS@

    ÈúóÔÚÄãµÄ'configure.in'ÖÐÄã¿ÉÒÔÖ¸¶¨:


    SUBDIRS = "src doc lib po"

    AC_SUBST(SUBDIRS)


    ÕâÑù×öµÄ½á¹ûÊÇautomake±»ÆÛÆ­ÁË,Ëü»áÔÚÖ¸¶¨Ä¿Â¼´´½¨°ü,µ«²¢²»ÕæÕý°ó¶¨ÄǸöÁбíÖ±µ½ÔËÐÐconfigure.


    SUBDIRS¿ÉÒÔ°üº¬ÅäÖõÄÌæ´ú(Èç,'@DIRS@');Automake ×Ô¼º²¢²»ÕæÕý¼ì²âÕâÒ»±äÁ¿µÄÄÚÈÝ.

    Èç¹û SUBDIRS ±»¶¨ÒåÁË,ÄÇôÄãµÄ'configure.in' ¾Í±ØÐë°üº¬AC_PROG_MAKE_SET.

    SUBDIRS µÄʹÓò¢²»¾ÖÏÞÓÚ¶¥²ã'Makefile.am'.Automake ¿É±»ÓÃÀ´¹¹ÔìÈÎÒâÉî¶ÈµÄ°ü.


²Î¿¼ÎÄÏ×

    Automake.htm

[Ŀ¼]


diff

diff

¡¡¡¡diffÊÇÉú³ÉÔ´Âë²¹¶¡µÄ±Ø±¸¹¤¾ß¡£ÆäÃüÁî¸ñʽΪ£º

¡¡diff [ÃüÁîÐÐÑ¡Ïî] ԭʼÎļþ ÐÂÎļþ

³£ÓÃÃüÁîÐÐÑ¡ÏîÈçÏ£º

¡¡¡¡¡¡-r µÝ¹é´¦ÀíĿ¼ ¡¡¡¡¡¡¡¡-u Êä³öͳһ¸ñʽ(unified format)

¡¡¡¡¡¡-N patchÀï°üº¬ÐÂÎļþ¡¡¡¡¡¡-a patchÀï¿ÉÒÔ°üº¬¶þ½øÖÆÎļþ

¡¡¡¡ËüµÄÊä³öÔÚstdoutÉÏ£¬ËùÒÔÄã¿ÉÄÜÐèÒª°ÑËüÖØ¶¨Ïòµ½Ò»¸öÎļþ¡£diffµÄÊä³öÓС°´«Í³¸ñʽ¡±ºÍ¡°Í³Ò»¸ñʽ¡±Ö®·Ö£¬ÏÖÔÚ´ó¶¼Ê¹ÓÃͳһ¸ñʽ£º

¡¡¡¡´«Í³¸ñʽʾÀý£º

¡¡¡¡¡¡[hahalee@builder]$ diff a.txt b.txt

¡¡¡¡¡¡1a2

¡¡¡¡¡¡> here we insert a new line

¡¡¡¡¡¡3d3

¡¡¡¡¡¡< why not this third line?

¡¡¡¡Í³Ò»¸ñʽʾÀý£º

¡¡¡¡¡¡[hahalee@builder]$ diff -u a.txt b.txt

¡¡¡¡¡¡--- a.txt Thu Apr 6 15:58:34 2000

¡¡¡¡¡¡+++ b.txt Thu Apr 6 15:57:53 2000

¡¡¡¡¡¡@@ -1,3 +1,3 @@

¡¡¡¡¡¡This is line one

¡¡¡¡¡¡+here we insert a new line

¡¡¡¡¡¡and this is line two

¡¡¡¡¡¡-why not this third line?

¡¡¡¡Í¨¹ý±È½Ï¿ÉÒÔ¿´³ö£¬´«Í³¸ñʽµÄpatchÎļþ±È½ÏС£¬³ýÁËҪɾ³ý/²åÈëµÄÐÐÍâûÓÐÈßÓàÐÅÏ¢¡£Í³Ò»¸ñʽÔò±£´æÁËÉÏÏÂÎÄ£¨È±Ê¡ÊÇÉÏϸ÷ÈýÐУ¬×îÉÙÐèÒªÁ½ÐУ©£¬ÕâÑù£¬patchµÄʱºò¿ÉÒÔÔÊÐíÐкŲ»¾«È·Æ¥ÅäµÄÇé¿ö³öÏÖ¡£ÁíÍ⣬ÔÚpatchÎļþµÄ¿ªÍ·Ã÷È·µØÓÃ---ºÍ+++±êʾ³öԭʼÎļþºÍµ±Ç°Îļþ£¬Ò²·½±ãÔĶÁ¡£ÒªÑ¡ÓÃͳһ¸ñʽ£¬Óà u ¿ª¹Ø¡£

¡¡¡¡Í¨³££¬ÎÒÃÇÐèÒª¶ÔÕû¸öÈí¼þ°ü×öÐ޸쬲¢Éú³ÉÒ»¸öpatchÎļþ£¬ÏÂÃæÊǵäÐ͵IJÙ×÷¹ý³Ì¡£ÕâÀï¾ÍÒªÓõ½Ç°Ãæ½éÉܵöÃüÁîÐпª¹ØÁË£º

¡¡¡¡tar xzvf software.tar.gz # Õ¹¿ªÔ­Ê¼Èí¼þ°ü£¬ÆäĿ¼Ϊsoftware

¡¡¡¡cp _a software software-orig # ×ö¸öÐÞ¸ÄǰµÄ±¸·Ý

¡¡¡¡cd software

¡¡¡¡[Ð޸쬲âÊÔ¡­¡­]

¡¡¡¡cd ..

¡¡¡¡diff _ruNa software-orig software > software-my.patch

¡¡¡¡ÏÖÔÚÎÒÃǾͿÉÒÔ±£´æsoftware-my.patch×öΪÕâ´ÎÐ޸ĵĽá¹û£¬ÖÁÓÚԭʼÈí¼þ°ü£¬¿ÉÒÔ²»±Ø±£´æ¡£µÈµ½Ï´ÎÐèÒªÔÙÐ޸ĵÄʱºò£¬¿ÉÒÔÓÃpatchÃüÁî°ÑÕâ¸ö²¹¶¡´ò½øÔ­Ê¼°ü£¬ÔÙ¼ÌÐø¹¤×÷¡£±ÈÈçÊÇÔÚlinux kernel ÉÏ×öµÄ¹¤×÷£¬¾Í²»±ØÃ¿´Î±£´æ¼¸Ê®Õ×Ð޸ĺóµÄÔ´ÂëÁË¡£ÕâÊǺô¦Ö®Ò»£¬ºÃ´¦Ö®¶þÊÇά»¤·½±ã£¬ÓÉÓÚunified patch¸ñʽÓÐÒ»¶¨µÄÄ£ºýÆ¥ÅäÄÜÁ¦£¬ÄܼõÉÙÔ­Èí¼þ°üÉý¼¶´øÀ´µÄά»¤¹¤×÷Á¿(¼ûºó)

patch

¡¡¡¡patchÃüÁî¸údiffÅäºÏʹÓ㬰ÑÉú³ÉµÄ²¹¶¡Ó¦Óõ½ÏÖÓдúÂëÉÏ¡£³£ÓÃÃüÁîÐÐÑ¡Ï

¡¡¡¡patch [ÃüÁîÐÐÑ¡Ïî] [´ýpatchµÄÎļþ[patch]]

¡¡¡¡-pn patch level(nÊÇÊý×Ö) -b[ºó׺] Éú³É±¸·Ý£¬È±Ê¡ÊÇ.orig

ΪÁË˵Ã÷ʲôÊÇpatch level£¬ÕâÀï¿´Ò»¸öpatchÎļþµÄÍ·±ê¼Ç¡£

¡¡¡¡diff -ruNa xc.orig/config/cf/Imake.cf xc.bsd/config/cf/Imake.cf

¡¡¡¡--- xc.orig/config/cf/Imake.cf Fri Jul 30 12:45:47 1999

¡¡¡¡+++ xc.new/config/cf/Imake.cf Fri Jan 21 13:48:44 2000

¡¡¡¡Õâ¸öpatchÈç¹ûÖ±½ÓÓ¦Óã¬Ëü»áÈ¥ÕÒxc.orig/config/cfĿ¼ÏµÄImake.cfÎļþ£¬¼ÙÈçÄãµÄÔ´ÂëÊ÷µÄ¸ùĿ¼ÊÇȱʡµÄxc¶ø²»ÊÇxc.orig£¬³ýÁËmv xc xc.origÖ®Í⣬ÓÐÎÞ¼òµ¥µÄ·½·¨Ó¦ÓôËpatchÄØ£¿patch level¾ÍÊÇΪ´Ë¶øÉ裺patch»á°ÑÄ¿±ê·¾¶Ãû¿³È¥¿ªÍ·patch level¸ö½Ú(ÓÉ/·Ö¿ªµÄ²¿·Ö)¡£ÔÚ±¾ÀýÖУ¬¿ÉÒÔÓÃÏÂÊöÃüÁcd xc; patch _p1 < /pathname/xxx.patch Íê³É²Ù×÷¡£×¢Ò⣬ÓÉÓÚûÓÐÖ¸¶¨patchÎļþ£¬patch³ÌÐòĬÈÏ´Óstdin¶ÁÈ룬ËùÒÔÓÃÁËÊäÈëÖØ¶¨Ïò¡£

¡¡¡¡Èç¹ûpatch³É¹¦£¬È±Ê¡ÊDz»½¨±¸·ÝÎļþµÄ(×¢£ºFreeBSDϵÄpatch¹¤¾ßȱʡÊDZ£´æ±¸·Ý)£¬Èç¹ûÄãÐèÒª£¬¿ÉÒÔ¼ÓÉÏ b ¿ª¹Ø¡£ÕâÑù°ÑÐÞ¸ÄǰµÄÎļþÒÔ¡°Ô­ÎļþÃû.orig¡±µÄÃû×Ö×ö±¸·Ý¡£Èç¹ûÄãϲ»¶ÆäËüºó׺Ãû£¬Ò²¿ÉÒÔÓá°b ºó׺¡±À´Ö¸¶¨¡£

¡¡¡¡Èç¹ûpatchʧ°Ü£¬patch»á°Ñ³É¹¦µÄpatchÐиøpatchÉÏ£¬Í¬Ê±£¨ÎÞÌõ¼þ£©Éú³É±¸·ÝÎļþºÍÒ»¸ö.rejÎļþ¡£.rejÎļþÀïÊÇûÓгɹ¦Ìá½»µÄpatchÐУ¬ÐèÒªÊÖ¹¤patchÉÏÈ¥¡£ÕâÖÖÇé¿öÔÚÔ­ÂëÉý¼¶µÄʱºòÓпÉÄܻᷢÉú¡£

¡¡¡¡¹ØÓÚ¶þ½øÖÆÎļþµÄ˵Ã÷£ºbinaryÎļþ¿ÉÒÔԭʼ·½Ê½´æÈëpatchÎļþ¡£diff¿ÉÒÔÉú³É(¼Ó-aÑ¡Ïî),patchÒ²¿ÉÒÔʶ±ð¡£Èç¹û¾õµÃÕâÑùµÄpatchÎļþÌ«ÄÑ¿´£¬½â¾ö·½·¨Ö®Ò»ÊÇÓÃuuencode´¦Àí¸ÃbinaryÎļþ¡£

[Ŀ¼]


rcs

¡¡¡¡µ¥¸öÎļþµÄ°æ±¾¿ØÖÆ/¹ÜÀí£¬Êʺ϶ÔÉÙÁ¿Îļþ½øÐа汾¿ØÖÆ£¬²»ÊʺÏС×é½øÐÐÏîĿЭ×÷¿ª·¢¡£Óŵ㣺ʹÓüò±ã£»È±µã£º¹¦ÄÜÓÐÏÞ¡£RCS³£ÓÃÃüÁîÓÐci/co/rcsdiff¡£

¡¡¡¡rcsÓÃÒ»¸öºó׺Ϊ¡°,v¡±µÄÎļþ±£´æÒ»ÎļþµÄÄÚÈݺÍËùÓÐÐ޸ĵÄÀúÊ·ÐÅÏ¢£¬Äã¿ÉÒÔËæÊ±È¡³öÈÎÒâÒ»¸ö°æ±¾£¬ÓÃrcs±£´æ³ÌÐò¾Í²»±ØÎª²»Í¬°æ±¾·Ö±ð±¸·Ý¡£ÏÂÃæÊÇÒ»¸ö¡°,v¡±ÎļþµÄÀý×Ó£º

¡¡£¨Ì«³¤£¬ºöÂÔ¡£Çë¿´ÑÝʾ»ò×Ô¼ºÕÒÒ»¸öÑù±¾£©

¡¡¡¡rcsÎļþÀï¼ÇÔØÁËÿ´Î¸üеÄÈÕÆÚ¡¢×÷Õß¡¢»¹ÓиüÐÂ˵Ã÷£¨Log£©¡£ÎļþµÄ×îа汾ÄÚÈÝ·ÅÔÚLogÖ®ºó£¬ÔÙºóÃæÊÇÀú´Î°æ±¾ÓëÆäºóÒ»°æ±¾µÄ²î±ð£¬°´check inµÄʱ¼ä×öµ¹ÐòÅÅÁС£Õâô×öµÄÔ­ÒòÊÇÒòΪа汾µÄcheck out»ú»á´óЩ£¬µ¹ÐòÅÅÁпÉÓÅ»¯check outʱ¼ä¡£

¡¡¡¡ ci _ check in£¬±£´æÐ°汾

¡¡¡¡´ËÃüÁî°ÑÖ¸¶¨ÎļþÌí¼Óµ½rcsÀúÊ·ÎļþÖУ¬Í¬Ê±°Ñ¸ÃÎļþɾ³ý¡£Èç¹ûµ±Ç°Ä¿Â¼ÏÂÓиöRCSĿ¼£¬ci»á°ÑÀúÊ·Îļþ´æÔÚ´Ë´¦£¬·ñÔò·ÅÔÚµ±Ç°Ä¿Â¼Ï¡£

¡¡¡¡¡¡[hahalee@builder]$ mkdir RCS

¡¡¡¡¡¡[hahalee@builder]$ ci wood.txt

¡¡¡¡¡¡RCS/wood.txt,v <-- wood.txt

¡¡¡¡¡¡enter description, terminated with single '.' or end of file:

¡¡¡¡¡¡NOTE: This is NOT the log message!

¡¡¡¡¡¡>> initial checkin #NOTE: ÕâÀïÊǸø±¾´Îcheckin×öµÄ˵Ã÷

¡¡¡¡¡¡>> .

¡¡¡¡¡¡initial revision: 1.1

¡¡¡¡¡¡done

¡¡¡¡¡¡[hahalee@builder]$ ls -l RCS/

¡¡¡¡¡¡×ܹ² 4

¡¡¡¡¡¡-r--r--r-- 1 hahalee hahalee 451 Apr 7 07:27 wood.txt,v

¡¡¡¡ciÒ²ÓзḻµÄÃüÁîÐÐÑ¡Ï±ÈÈ磬¿ÉÒÔÖ¸¶¨check inµÄ°æ±¾ºÅ£¬ÉõÖÁ¿ÉÒÔÓÃ×Ö·û´®À´×ö°æ±¾ºÅ£¬Çë²éÔÄciµÄmanpage¡£

¡¡¡¡ co _ check out£¬È¡³öµ±Ç°£¨»òÈÎÒ⣩°æ±¾

³£ÓÃÃüÁîÐÐÑ¡Ï

¡¡ -r[rev] Ö¸¶¨°æ±¾µÄcheckout -l[rev] Ö¸¶¨°æ±¾£¬¼ÓËøµÄcheckout

¡¡¡¡Èç²»¼Ó¿ÉÑ¡µÄ°æ±¾ºÅ£¬È±Ê¡ÊÇ×î½üµÄ°æ±¾¡£Èç¹ûÖ»ÐèÒªÒ»·ÝÖ»¶ÁµÄ¿½±´£¬ÓÃ-r£¨ÌØÊâÇé¿ö£¬ÈçÐèÒªÒ»·ÝÖ»¶ÁµÄµ±Ç°¿½±´£¬¿ÉÒÔ²»ÒªÈκÎÑ¡Ï¡£ÈçÐèÒª¶ÔcheckoutµÄÎļþ½øÐÐÐ޸ģ¬ÇëÓÃ-lÑ¡Ïî¡£³£¼ûµÄ²Ù×÷Á÷³ÌÊÇ£º

¡¡¡¡¡¡ci xxx.c; co _l xxx.c; ±à¼­£¬²âÊÔ; ci xxx.c ¡­¡­¡­¡­

¡¡¡¡ÔÚÿ´ÎcheckinµÄʱºò£¬°æ±¾ºÅ»á×Ô¶¯ÔÚ×îµÍλÉϼÓ1¡£ÎªÁËÔÚÎļþÖз´Ó³°æ±¾¿ØÖÆÐÅÏ¢£¬rcsÌṩÁ˼¸¸öÌØÊâµÄ¹Ø¼ü×Ö£¬ÕâÀï½éÉÜ$Id$ºÍ$Log$£¬ÆäËüµÄÇë²Î¿¼info cvs¡£

¡¡ $Id$´ú±íÎļþµÄ°æ±¾±êʶ£¬ÓÉÎļþÃû/°æ±¾ºÅ/×îºóÒ»´Îcheckinʱ¼ä/×îºóÒ»´ÎcheckinµÄÓû§Õ⼸Ïî×é³É£¬±ÈÈ磺

$Id: wood.txt,v 1.3 2000/04/07 00:06:52 hahalee Exp $

Èç¹ûÐèÒª¸üÏêϸµÄÐÅÏ¢£¬¿ÉÒÔÓÃ$Log$£¬$Log$±»À©Õ¹Îª¸ÃÎļþµÄËùÓÐÐÞ¸ÄÈÕÆÚºÍ±¸×¢£¬Àý£º

¡¡ ¡¡¡¡/* $Log: wood.txt,v $

¡¡¡¡ ¡¡* Revision 1.2 2000/04/07 00:29:12 hahalee

¡¡¡¡¡¡ * This is my second checkin

¡¡¡¡¡¡ *

¡¡¡¡¡¡ * Revision 1.1 2000/04/07 00:28:39 hahalee

¡¡¡¡¡¡ * Initial revision

¡¡¡¡¡¡ * /

¡¡¡¡Ë³±ã½éÉÜÒ»ÏÂidentÃüÁî¡£ËüµÄ¹¦ÄܱȽϼòµ¥£¬¾ÍÊÇ´ÓÎļþÖÐËÑË÷³öRCS±êʾ·û²¢´òÓ¡³öÀ´¡£¿ÉÒÔÓÃident /usr/sbin/sendmail À´¿´¿´¡£²»ÓÃ˵£¬Èç¹ûÏëÔÚ×îÖÕµÄbinaryÎļþÀïÕÒµ½$Id$´®£¬µÃÒª°ÑËüÉùÃ÷µ½Ò»¸ö×Ö·û´®ÀïÈ¥¡£ºÜ¶à³ÌÐòÀïÕâôд£º

¡¡¡¡ ¡¡#ifndef lint //ÕâÀïÊÇΪÁ˱ÜÃâlint±¨¸æ¡°±äÁ¿Î´Ê¹Óá±

¡¡¡¡¡¡ static const char rcsid[] =

¡¡¡¡¡¡"$Id: bin/sh.c,v 1.15 1999/08/27 23:13:43 wp Exp $"; //ÕâÊÇ´Ó $Id$ À©Õ¹¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ //³öÀ´µÄ

¡¡¡¡¡¡ #endif

¡¡¡¡ rcsdiff _ ±È½ÏrevisionÖ®¼äµÄ²îÒì.ÔËÐÐdiffÃüÁÉú³ÉpatchÎļþ

ÃüÁîÐиñʽ£ºrcsdiff [Ñ¡Ïî] [-r°æ±¾[-r°æ±¾]] [diffÑ¡Ïî] ÎļþÃû

¡¡¡¡ËµÃ÷£ºÈç¹ûû¸ø³ö°æ±¾ºÅ£¬°ÑÉÏ´ÎcheckinµÄÄÚÈÝͬµ±Ç°¹¤×÷Îļþ±È½Ï£»Èç¸ø³öÁËÒ»¸ö°æ±¾ºÅ£¬¾Í°ÑÄǸö°æ±¾µÄÄÚÈÝͬµ±Ç°¹¤×÷Îļþ±È½Ï£»Èô¸ø³öÁËÁ½¸ö°æ±¾ºÅ£¬ÔòÓõÚÒ»¸öÀ´¸úµÚ¶þ¸ö±È½Ï¡£ÓÉÓÚrcsdiffµ÷ÓÃdiffÃüÁËùÓеÄdiffÑ¡Ïî¶¼¿ÉÓá£ËüµÄÊä³öÒ²ÊǼÓÁ˶îÍâÐÅÏ¢µÄdiff¸ñʽÄÚÈÝ£¬¿ÉÒÔ¸øpatchʹÓá£

¡¡ rcsÀïÃæ»¹ÓÐrcs£¬rcsclean£¬rlog£¬merge£¬rcsmergeÎÒÃÇûÓÐÌáµ½£¬ÓеÄÌØ±ð¼òµ¥ÓеÄÌØ±ð·±ËöÇÒÓõÃÉÙ¡£ÆäÖÐrcsÃüÁî¿ÉÒÔÓÃÀ´¶ÔrcsÎļþ½øÐи÷ÖÖ¾«Ï¸µÄά»¤£¬×îΪ¸´ÔÓ¡£


[Ŀ¼]


ÄÚºËÖØ±àÒë³£¼û¹ÊÕÏ

    ¸Ã³ÌÐòÖ»ÊǼòµ¥µØÂ¼Ò»Ð¡¶Î´¿ÒôƵÊý¾Ý´æ´¢ÔÚtest.wavÖÐ,ÓÃÃüÁîcat test.wav >/dev/audio¾Í¿ÉÒÔ²¥·Å³öÀ´¡£ÒòΪ³ÌÐòÒª¶ÁдÉù¿¨µÄÉ豸Îļþ,ËùÒÔÄã±ØÐëÓÃÏàÓ¦µÄȨÏÞ,»òÕßÄãÊÇroot

#include <sys/soundcard.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

main()
{
  int id,fd,i,j;
  char testbuf[4096];
  id=open("/dev/audio",O_RDWR);
  //ÕâÀïʹÓÃÉù¿¨Çý¶¯³ÌÐò,linuxÀïµ±×÷Ò»¸öÎļþ¶Áд
  fd=open("test.wav",O_RDWR);
  //Ò»¸öÎļþ

  if(id<0||fd<0){
    printf("error in open the device!\n");
    printf("id %d\t dsp%d\t seq%d\n",id,dsp,seq);
    exit(-1);
  }

  post=0;
  ioctl(id,SNDCTL_DSP_RESET,(char *)&i);
  ioctl(id,SNDCTL_DSP_SYNC,(char *)&i);
  i=1;
  ioctl(id,SNDCTL_DSP_NONBLOCK,(char *)&i);
  i=8000;
  ioctl(id,SNDCTL_DSP_SPEED,(char *)&i);
  i=1;
  ioctl(id,SNDCTL_DSP_CHANNELS,(char *)&i);
  i=8;
  ioctl(id,SNDCTL_DSP_SETFMT,(char *)&i);
  i=3;
  ioctl(id,SNDCTL_DSP_SETTRIGGER,(char *)&i);
  i=3;
  ioctl(id,SNDCTL_DSP_SETFRAGMENT,(char *)&i);
  i=1;
  ioctl(id,SNDCTL_DSP_PROFILE,(char *)&i);

  for(j=0;j<10;){
    i=read(id,testbuf,4096);
    if(i>0){
      write(fd,filebuf,i);
      j++;
    }
  }

  close(fd);
  close(id);

}

[Ŀ¼]


cvs

¡¡¡¡CVS£¬¹ËÃû˼Ò壬ÊǸö¿ÉÒÔÓÃÔÚС×éЭ×÷»·¾³ÏµÄÔ´Âë°æ±¾¹ÜÀíϵͳ¡£Í¬ÀàµÄÈí¼þÓÐAT&TµÄSCCS£¨Source Code Control System£©£¬»¹ÓÐPVCSµÈ¡£ÔÚOpenSourceÏîÄ¿ÀïCVSÓõÃ×îΪ¹ã·º, Linux kernel²»Ê¹ÓÃCVSÀ´Î¬»¤£¬ÏÂÃæÎÒÃǽ«»á²Î¿¼FreeBSDµÄÔ´Âë¹ÜÀíÀ´×öʾÀý¡£CVSÊǸöÏ൱¸´ÔÓµÄϵͳ£¬FreeBSDÉõÖÁÉèÓÐרÃŵġ°CVS¹ÜÀíÔ±¡±£¨CVS ¡°Maester¡±£©À´È«Ã渺ÔðÏîÄ¿µÄCVS repositoryά»¤¡£

¡¡¡¡ÏÂÃæ½éÉÜÓëCVSÏà¹ØµÄÈô¸É¸ÅÄîºÍÊõÓ

¡¡¡¡¡¡¡¡Repository:¡¡¡¡¡¡¡°Ô´Âë²Ö¿â¡±£¬CVS´æ·ÅµÄÏîĿԴÂëÀúÊ·µµ°¸

¡¡¡¡¡¡¡¡CVSROOT:¡¡¡¡¡¡¡¡¡¡¸Ã»·¾³±äÁ¿Ö¸Ã÷CVS Repository´æ·ÅµÄĿ¼

¡¡¡¡¡¡¡¡Module:¡¡¡¡¡¡ ¡¡¡¡Ä£¿é¡£¾ÍÊÇCVSROOTÏµĶ¥¼¶Ä¿Â¼Ãû

¡¡¡¡¡¡¡¡Vendor Branch:¡¡¡¡·ÖÖ§¡£ÔÚÒ»Ì×RepositoryÀï¿ÉÒÔ´æ·Å¶à¸ö´úÂë·ÖÖ§µÄÀúÊ·

¡¡¡¡¡¡¡¡Release Tag:¡¡¡¡¡¡·¢Ðбê¼Ç¡£¶ÔÓÚÿһ¸ö°æ±¾£¬¿ÉÒÔÓ÷ûºÅÀ´×ö±ê¼Ç

¡¡¡¡ÏÂÃæÊÇÒ»¸öCVS repositoryµÄ°æ±¾ÑÜÉúͼ£¬´óÖÂÃè»æÁËFreeBSDµÄ°æ±¾·¢ÐÐÇé¿ö¡£Í¼ÖеÄRELENG_3ºÍRELENG_4±íʾ¡°Release Engine¡±£¬Ò²¾ÍÊÇVendor Branch£¬Ã¿¸öBranch·ÖÍ··¢Õ¹£¬µÈij¸öBranchµÄ¿ª·¢µ½ÁËÒ»¶¨µÄÖÊÁ¿Ë®×¼£¬¾Í×ö¸öRelease Tag¡£±ÈÈç×î½üµÄ4.0-RELEASEµÄRelease TagÊÇREL_4_0¡£

¡¡¡¡ÕâЩ²»Í¬µÄBranch¶¼´æ·ÅÔÚͬһ¸öRepository TreeÀï¡£

¡¡¡¡CVSÊǸöºÜ¸´ÔÓµÄϵͳ£¬¿ÉÒԲο¼ÏÂÃæÁ½¸öURL»ñµÃ½øÒ»²½µÄÐÅÏ¢£º

http://www.cyclic.com

http://www.loria.fr/~molli/cvs-index.html

£¨ÔÚcvsÈí¼þ°üÀﺬÓÐÏêϸµÄÎĵµ£¬Ó¦µ±²éÔÄinfo°æ±¾¡£¼¸¸öpsÎļþ¶¼Ì«ÀÏÁË£©

ÏÂÃæ½éÉÜCVSµÄ»ù±¾Ó÷¨¡£

¢Ù Import µ¼Èë/´´½¨CVS Repository Tree

¡¡¡¡Ê×ÏȽ¨Ò»¸öĿ¼×÷ΪÄãµÄCVSROOT£¬È»ºóÓÃcvs initÃüÁî¶ÔÆä³õʼ»¯£¨½¨Á¢Ò»ÏµÁÐlog,configÎļþ£©¡£È»ºóµ½¹¤×÷Ŀ¼ÏÂʹÓÃcvs importÃüÁ

¡¡¡¡¡¡[hahalee@builder]$ mkdir /home/hahalee/CVS

¡¡¡¡¡¡[hahalee@builder]$ export CVSROOT=/home/hahalee/CVS

¡¡¡¡¡¡[hahalee@builder]$ cvs init

¡¡¡¡¡¡[hahalee@builder]$ cvs import _b 0.5.0 hftpd RELENG_0 REL_0

¡¡¡¡¡¡N hftpd/tar.h

¡¡¡¡¡¡N hftpd/auth.h

¡¡¡¡¡¡[blah...blah...blah...]

¡¡¡¡¡¡N hftpd/docs/rfcs/rfc0959.txt

¡¡¡¡¡¡N hftpd/docs/rfcs/rfc2428.txt

¡¡¡¡¡¡No conflicts created by this import

¡¡¡¡ÉÏÊö²Ù×÷ÔÚ$CVSROOTÏÂÉú³ÉhftpdĿ¼£¬¿ÉÒÔ¿´µ½ÀïÃæ¶¼ÊǺó׺Ϊ¡°,v¡±µÄÎļþ£¬Õâ¾ÍÊÇimport½øÀ´µÄRepository¡£RELENG_0ÊÇvendor-tag£¬REL_0ÊÇrelease-tag¡£vendor-tag¾ÍÊÇvendor branch tag£¬¿ÉÒÔÀí½âΪ¡±code name¡±¡£

¢Ú Checkout ´´½¨Ë½Óй¤×÷Ŀ¼/Export

¡¡¡¡»»Ò»¸ö¿ÕĿ¼£¬ÔËÐÐ cvs checkout modules_name ¼´¿É£º

¡¡¡¡¡¡[hahalee@builder]$ cvs checkout hftpd# hftpdÊÇÎÒÃǵÄmodule¡¡name

¡¡¡¡¡¡cvs checkout: Updating hftpd

¡¡¡¡¡¡U hftpd/AUTHORS

¡¡¡¡¡¡U hftpd/COPYING

¡¡¡¡¡¡[blah blah blah] # Ê¡ÂÔÐí¶à

¡¡¡¡¡¡[hahalee@builder t]$ ls -l

¡¡¡¡¡¡×ܹ² 0

¡¡¡¡¡¡drwxrwxr-x 5 hahalee hahalee 1253 Apr 7 20:08 hftpd

¡¡¡¡¡¡[hahalee@builder t]$ find ./ -type d

¡¡¡¡´Ó×îºóÒ»ÌõÃüÁîµÄÊä³ö¿É¿´µ½£¬checkoutµÄ¹¤×÷Ŀ¼Àï¶àÁËCVSĿ¼¡£ÀïÃæ¼ÇÔØÁËCVSÏà¹ØµÄÐÅÏ¢£¬¿ÉÒÔ·½±ãºóÐøµÄcvs²Ù×÷¡£Èç¹û´¿´âÊÇΪÁË¿½±´³ö×îеÄsource tree£¬¿ÉÒÔÓÃexport£¬´Ëʱ²»»á½¨Á¢CVSĿ¼¡£

¢Û Update ¸üÐÂ

¡¡¡¡µ±ÄãÍê³Éijһ²¿·Ö´úÂëµÄʱºò£¬ÏȲ»Ã¦Ìá½»£¬¿ÉÒ԰ѱðÈË¿ÉÄÜ×öÁËµÄÆäËûÐÞ¸Äupdate¹ýÀ´È»ºóͳһ±àÒëµ÷ÊÔÎÞÎóºóÔÙÌá½»£¬ÕâÊÇteam workµÄ×¼Ôò¡£ÔÚcheckout³öÀ´µÄ¹¤×÷Ŀ¼Ï£¨²»¹Üʲô×ÓĿ¼£©£¬Ö±½Ócvsup update ¾Í¿ÉÒÔÁË£¬µ±È»ÄãÒªÏȰÑCVSROOT»·¾³±äÁ¿ÉèÖúá£

¢Ü Commit Ìá½»

¡¡¡¡ºÜ¼òµ¥£¬cvs commit¡£µ«Äã±ØÐëÒªÔÚcheckout³öÀ´µÄ¹¤×÷Ŀ¼ÀïÌá½»²ÅÐÐ:

¡¡¡¡¡¡[hahalee@builder]$ cvs commit

¡¡¡¡¡¡cvs commit: Examining .

¡¡¡¡¡¡cvs commit: Examining docs

¡¡¡¡¡¡cvs commit: Examining docs/man

¡¡¡¡¡¡cvs commit: Examining docs/rfcs

¡¡¡¡¡¡cvs commit: Examining tools

¡¡¡¡¡¡Checking in AUTHORS;

¡¡¡¡¡¡/home/hahalee/CVS/hftpd/AUTHORS,v <-- AUTHORS

¡¡¡¡¡¡new revision: 0.6; previous revision: 0.5

¡¡¡¡¡¡done

¡¡¡¡¹ØÓÚ²¢·¢Ìá½»³åÍ»£ºÈκÎÓû§¿ÉÒÔËæÒâcheckoutËûÃÇ×Ô¼ºµÄ¹¤×÷¿½±´£¬commitÒ²ÊDz»ÊÜÏÞÖÆµÄ¡£ÕâÑù£¬µ±Óû§aºÍb·Ö±ðcheckoutÁË1.2°æµÄc.c£¬È»ºó¸÷×Ô¶Ôc.c×öÁËÐ޸ģ¬aÌá½»ÁËËûµÄÐ޸ģ¬È»ºó£¬µ±bÌá½»µÄʱºò£¬³åÍ»¾Í²úÉúÁË¡£

¡¡¡¡Õâʱºò£¬cvs»á×öÒÔ϶¯×÷£º

¸æËßÓû§b£¬¶Ôc.cµÄÌá½»·¢Éú³åÍ»
¶ÔÓû§bµ±Ç°µÄc.c×ö±¸·ÝÎļþ.#c.c.1.2
ÊÔͼºÏ²¢aºÍbµÄÐ޸ģ¬Éú³ÉеÄc.c
È»ºó£¬Óû§bÓ¦µ±ÐÞ¸Äc.c£¬È¥µô/ºÏ²¢³åÍ»µÄÐУ¬²¢ÒÔ°æ±¾1.4Ìá½»¡£

¢Ý Diff

¡¡¡¡¿ÉÒÔÓÃÀàËÆrcsdiffµÄ·½·¨ÓÃcvsÉú³Épatch£¬ÃüÁîÐÐÓï·¨Ò²ÀàËÆ

¡¡¡¡¡¡[hahalee@builder]$ cvs diff -u -r0.5 AUTHORS

¡¡¡¡¡¡Index: AUTHORS

¡¡¡¡¡¡===================================================================

¡¡¡¡¡¡RCS file: /home/hahalee/CVS/hftpd/AUTHORS,v

¡¡¡¡¡¡retrieving revision 0.5

¡¡¡¡¡¡retrieving revision 0.6

¡¡¡¡¡¡diff -u -r0.5 -r0.6

¡¡¡¡¡¡--- AUTHORS 2000/04/07 10:46:02 0.5

¡¡¡¡¡¡+++ AUTHORS 2000/04/07 14:05:57 0.6

¡¡¡¡¡¡@@ -1,3 +1,4 @@

¡¡¡¡¡¡+ah! let me in!

¡¡¡¡¡¡So then, who can't spell

¡¡¡¡¡¡Develloppopotamus?

¡¡¡¡¡¡Quite a lot of us.

¡¡¡¡»¹ÓÐÒ»¸ördiff£¬ÓÃÀ´Éú³ÉÁ½¸ö²»Í¬µÄrelease Ö®¼äµÄpatch¡£

¢Þ ÆäËû²Ù×÷

¡¡¡¡¡¡cvs µÄÆäËû²Ù×÷»¹°üÀ¨ÓУº

¡¡¡¡¡¡admin ¹ÜÀí¹¦ÄÜ

¡¡¡¡¡¡tag ¶Ôijһ°æ±¾×ö·ûºÅ±ê¼Ç

¡¡¡¡¡¡release È¡Ïûcheckout,ɾ³ý¹¤×÷Ŀ¼£¨releaseÔÚÕâÀïÊÇ¡°ÊÍ·Å¡±µÄÒâ˼£©

¡¡¡¡¡¡add,remove ÍùrepositoryÀïÌí¼Ó/ɾ³ýÎļþ

¡¡¡¡¡¡history ²é¿´repository²Ù×÷ÀúÊ·¼Ç¼

¢ß CVS µÄ¶àÆ½Ì¨ÌØÐÔÒÔ¼°C/SÀ©Õ¹

¡¡¡¡cvsÊÇ¶àÆ½Ì¨µÄ£¬¿ª·¢¿ÉÒÔÔÚ¶àÖÖÆ½Ì¨±ÈÈ磬¿ÉÒÔ°ÑlinuxÉϵÄCVS Repositoryͨ¹ýsamba export³öÀ´ÔÚWindowsƽ̨ÉÏ×ö¿ª·¢¡£ÏÖÔںܶàÈí¼þ°üÀï°üº¬ÓÐ*NIX/Windows/MacOSµÈ¶àƽ̨֧³Ö´úÂ룬cvsµÄ¿çÆ½Ì¨ÌØÐÔ¿ÉÌṩ×îºÃµÄ¶àƽ̨¿ª·¢Ö§³Ö¡£

¡¡¡¡²»¹ý£¬cvsµÄ²Ù×÷ÊÇÖ±½Ó»ùÓÚÎļþϵͳµÄ£¬ÔÚÐèÒª´óÁ¿Ô¶³ÌЭ×÷µÄ³¡ºÏÎÊÌâºÜ¶à£¬Ô¶³ÌµÄNFS mountЧÂÊÌ«²î£¬Ò²»áÓа²È«ÎÊÌ⡣а汾µÄcvs×ÔÉíÄÚ½¨ÁËClient/ServerÖ§³Ö£¬Ò²¿ÉÒÔÀûÓÃUnixÉÏ´«Í³µÄÔ¶³Ì½»»¥ÊÖ¶ÎÀ´Í¨Ñ¶¡£

¡¡¡¡1£¬Í¨¹ýrsh£¨Ò²¿ÉÓÃsshÌæ»»£©

¡¡¡¡2£¬Ê¹ÓÃcvs×Ô´øµÄC/SÓû§ÈÏÖ¤£ºpserver£¨È±Ê¡¶Ë¿Ú2401£©

¡¡¡¡3£¬Ê¹ÓÃkerberosµÄgserver¡¢kserver


[Ŀ¼]


¹²Ïí¿â¹¤¾ß

strip£º
nm£º
size£º
string£º

1 ´´½¨ºÍʹÓþ²Ì¬¿â

´´½¨Ò»¸ö¾²Ì¬¿âÊÇÏ൱¼òµ¥µÄ¡£Í¨³£Ê¹Óà ar ³ÌÐò°ÑһЩĿ±êÎļþ£¨.o£©×éºÏÔÚÒ»Æð£¬
³ÉΪһ¸öµ¥¶ÀµÄ¿â£¬È»ºóÔËÐÐ ranlib£¬ÒÔ¸ø¿â¼ÓÈëһЩË÷ÒýÐÅÏ¢¡£

2  ´´½¨ºÍʹÓù²Ïí¿â
ÌØÊâµÄ±àÒëºÍÁ¬½ÓÑ¡Ïî
-D_REENTRANT         ʹµÃÔ¤´¦ÀíÆ÷·ûºÅ _REENTRANT ±»¶¨Ò壬Õâ¸ö·ûºÅ¼¤»îһЩºêÌØÐÔ¡£
-fPIC                Ñ¡Ïî²úÉúλÖöÀÁ¢µÄ´úÂë¡£ÓÉÓÚ¿âÊÇÔÚÔËÐеÄʱºò±»µ÷È룬Òò´ËÕâ¸ö
                     Ñ¡ÏîÊDZØÐèµÄ£¬ÒòΪÔÚ±àÒëµÄʱºò£¬×°ÈëÄÚ´æµÄµØÖ·»¹²»ÖªµÀ¡£Èç¹û
                     ²»Ê¹ÓÃÕâ¸öÑ¡Ï¿âÎļþ¿ÉÄܲ»»áÕýÈ·ÔËÐС£
-shared              Ñ¡Ïî¸æËß±àÒëÆ÷²úÉú¹²Ïí¿â´úÂë¡£
-Wl,-soname          -Wl ¸æËß±àÒëÆ÷½«ºóÃæµÄ²ÎÊý´«µÝµ½Á¬½ÓÆ÷¡£¶ø -soname Ö¸¶¨ÁË
                     ¹²Ïí¿âµÄ soname¡£


    ££ ¿ÉÒÔ°Ñ¿âÎļþ¿½±´µ½ /etc/ld.so.conf ÖÐÁоٳöµÄÈκÎĿ¼ÖУ¬²¢ÒÔ
root Éí·ÝÔËÐÐ ldconfig£»»òÕß
    ££ ÔËÐÐ export LD_LIBRARY_PATH='pwd'£¬Ëü°Ñµ±Ç°Â·¾¶¼Óµ½¿âËÑË÷·¾¶ÖÐÈ¥¡£


3  ʹÓø߼¶¹²Ïí¿âÌØÐÔ
1> ldd ¹¤¾ß
ldd ÓÃÀ´ÏÔʾִÐÐÎļþÐèÒªÄÄЩ¹²Ïí¿â, ¹²Ïí¿â×°ÔØ¹ÜÀíÆ÷ÔÚÄÄÀïÕÒµ½ÁËÐèÒªµÄ¹²Ïí¿â.

2> soname

¹²Ïí¿âµÄÒ»¸ö·Ç³£ÖØÒªµÄ£¬Ò²ÊǷdz£ÄѵĸÅÄîÊÇ soname--¼òд¹²ÏíÄ¿±êÃû£¨short for shared object name£©¡£ÕâÊÇÒ»¸öΪ¹²Ïí¿â£¨.so£©Îļþ¶øÄÚǶÔÚ¿ØÖÆÊý¾ÝÖеÄÃû×Ö¡£ÈçÇ°ÃæÌáµ½µÄ£¬Ã¿Ò»¸ö³ÌÐò¶¼ÓÐÒ»¸öÐèҪʹÓõĿâµÄÇåµ¥¡£Õâ¸öÇåµ¥µÄÄÚÈÝÊÇһϵÁпâµÄ soname£¬Èçͬ ldd ÏÔʾµÄÄÇÑù£¬¹²Ïí¿â×°ÔØÆ÷±ØÐëÕÒµ½Õâ¸öÇåµ¥¡£

soname µÄ¹Ø¼ü¹¦ÄÜÊÇËüÌṩÁ˼æÈÝÐԵıê×¼¡£µ±ÒªÉý¼¶ÏµÍ³ÖеÄÒ»¸ö¿âʱ£¬²¢ÇÒпâµÄ soname ºÍÀϵĿâµÄ soname Ò»Ñù£¬ÓþɿâÁ¬½ÓÉú³ÉµÄ³ÌÐò£¬Ê¹ÓÃеĿâÒÀÈ»ÄÜÕý³£ÔËÐС£Õâ¸öÌØÐÔʹµÃÔÚ Linux Ï£¬Éý¼¶Ê¹Óù²Ïí¿âµÄ³ÌÐòºÍ¶¨Î»´íÎó±äµÃÊ®·ÖÈÝÒס£

ÔÚ Linux ÖУ¬Ó¦ÓóÌÐòͨ¹ýʹÓà soname£¬À´Ö¸¶¨ËùÏ£Íû¿âµÄ°æ±¾¡£¿â×÷ÕßÒ²¿ÉÒÔͨ¹ý±£Áô»òÕ߸ıä soname À´ÉùÃ÷£¬ÄÄЩ°æ±¾ÊÇÏ໥¼æÈݵģ¬ÕâʹµÃ³ÌÐòÔ±°ÚÍÑÁ˹²Ïí¿â°æ±¾³åÍ»ÎÊÌâµÄÀ§ÈÅ¡£

²é¿´/usr/local/lib Ŀ¼£¬·ÖÎö MiniGUI µÄ¹²Ïí¿âÎļþÖ®¼äµÄ¹ØÏµ

3> ¹²Ïí¿â×°ÔØÆ÷

µ±³ÌÐò±»µ÷ÓõÄʱºò£¬Linux ¹²Ïí¿â×°ÔØÆ÷£¨Ò²±»³ÆÎª¶¯Ì¬Á¬½ÓÆ÷£©Ò²×Ô¶¯±»µ÷Óá£ËüµÄ×÷ÓÃÊDZ£Ö¤³ÌÐòËùÐèÒªµÄËùÓÐÊʵ±°æ±¾µÄ¿â¶¼±»µ÷ÈëÄÚ´æ¡£¹²Ïí¿â×°ÔØÆ÷Ãû×ÖÊÇ ld.so »òÕßÊÇ ld-linux.so£¬ÕâÈ¡¾öÓÚ Linux libc µÄ°æ±¾£¬Ëü±ØÐëʹÓÃÒ»µãÍⲿ½»»¥£¬²ÅÄÜÍê³É×Ô¼ºµÄ¹¤×÷¡£È»¶øËü½ÓÊÜÔÚ»·¾³±äÁ¿ºÍÅäÖÃÎļþÖеÄÅäÖÃÐÅÏ¢¡£

Îļþ /etc/ld.so.conf ¶¨ÒåÁ˱ê׼ϵͳ¿âµÄ·¾¶¡£¹²Ïí¿â×°ÔØÆ÷°ÑËü×÷ΪËÑË÷·¾¶¡£ÎªÁ˸ıäÕâ¸öÉèÖ㬱ØÐëÒÔ root Éí·ÝÔËÐÐ ldconfig ¹¤¾ß¡£Õ⽫¸üР/etc/ls.so.cache Îļþ£¬Õâ¸öÎļþÆäʵÊÇ×°ÔØÆ÷ÄÚ²¿Ê¹ÓõÄÎļþÖ®Ò»¡£

¿ÉÒÔʹÓÃÐí¶à»·¾³±äÁ¿¿ØÖƹ²Ïí¿â×