| gcc |
×÷ Õߣº ÐíÃ÷Ñå
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.
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#
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µÄһЩ³£ÓñàÒëÑ¡Ïî¶Ô´úÂëµÄÓ°Ïì¡£µ±È»´úÂë±äÁË£¬ËüµÄÄÚ´æ²¼¾ÖÒ²¾Í»á±äÁË£¬ËæÖ®exploitÒ²¾ÍÒª×öÏàÓ¦µÄ±ä¶¯¡£
gccµÄ±àÒëÑ¡ÏîʵÔÚÌ«¶à£¬±¾ÎļìÁ˼¸¸ö×î³£ÓõÄÑ¡Ïî¡£
¡ï ÑÝʾ³ÌÐò
[alert7@redhat62 alert7]$ cat > test.c
#include
void hi(void)
{
printf("hi");
}
int main(int argc, char *argv[])
{
hi();
return 0;
}
ÔÚ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ÓÅ»¯µôÒ²ÊÇûÓÐÎÊÌâµÄ¡£
ºöÂÔÖ¡Ö¸Õë¡£ÕâÑùÔÚ³ÌÐò¾Í²»ÐèÒª±£´æ£¬°²×°£¬ºÍ»Ö¸´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.
²úÉúλÖÃÎ޹شúÂ루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 +--------+
| ...... |
(ÄÚ´æµÍÖ·)
not a dynamic executable
-static³öÀ´µÄ´úÂëÒѾûÓÐPLTÁË£¬GOTËäÈ»ÓУ¬ÒѾȫ²¿Îª0ÁË¡£
Óï·¨ÉÏÖ÷ÒªÓÐÒÔϼ¸¸ö²»Í¬.
¡ï ¼Ä´æÆ÷ÃüÃûÔÔò
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; \
}
¼Ä´æÆ÷ÃüÃû
¼Ä´æÆ÷Ãû³ÆÓÐ % ǰ׺¡£¼´£¬Èç¹û±ØÐëʹÓà 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
±¾ÀýÖУ¬»ã±à³ÌÐòÄ£°åÓÉ»ã±àÖ¸Áî×é³É¡£ÊäÈë²Ù×÷ÊýÊ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" Íâ·´Ó³³öÀ´¡£
Èç¹ûÏ£ÍûÈ·±£±àÒëÆ÷²»»áÔÚ "asm" ÄÚ²¿ÓÅ»¯Ö¸Á¿ÉÒÔÔÚ "asm" ºóʹÓùؼü×Ö "volatile"¡£Èç¹û³ÌÐò±ØÐëÓë ANSI C ¼æÈÝ£¬ÔòÓ¦¸ÃʹÓà __asm__ ºÍ __volatile__£¬¶ø²»ÊÇ asm ºÍ volatile¡£
ÿ¸ö²Ù×÷Êý¶¼ÓɲÙ×÷ÊýÔ¼Êø×Ö·û´®Ö¸¶¨£¬ºóÃæ¸úÓÃÀ¨»¡À¨ÆðµÄ C ±í´ïʽ£¬ÀýÈ磺"constraint" (C expression)¡£²Ù×÷ÊýÔ¼ÊøµÄÖ÷Òª¹¦ÄÜÊÇÈ·¶¨²Ù×÷ÊýµÄѰַ·½Ê½¡£
¿ÉÒÔÔÚÊäÈëºÍÊä³ö²¿·ÖÖÐͬʱʹÓöà¸ö²Ù×÷Êý¡£Ã¿¸ö²Ù×÷ÊýÓɶººÅ·Ö¸ô¿ª¡£
ÔÚ»ã±à³ÌÐòÄ£°åÄÚ²¿£¬²Ù×÷ÊýÓÉÊý×ÖÒýÓá£Èç¹û×ܹ²ÓÐ n ¸ö²Ù×÷Êý£¨°üÀ¨ÊäÈëºÍÊä³ö£©£¬ÄÇôµÚÒ»¸öÊä³ö²Ù×÷ÊýµÄ±àºÅΪ 0£¬ÖðÏîµÝÔö£¬×îºóÄǸöÊäÈë²Ù×÷ÊýµÄ±àºÅΪ n-1¡£×ܲÙ×÷ÊýµÄÊýÄ¿ÏÞÖÆÔÚ 10£¬Èç¹û»úÆ÷ÃèÊöÖÐÈκÎÖ¸ÁîģʽÖеÄ×î´ó²Ù×÷ÊýÊýÄ¿´óÓÚ 10£¬ÔòʹÓúóÕß×÷ΪÏÞÖÆ¡£
ÖÁÓڹؼü×Ö£¬Èç¹ûÖ¸ÁîÒÔijЩ²»¿ÉÔ¤ÖªÇÒ²»Ã÷È·µÄ·½Ê½ÐÞ¸ÄÁËÄڴ棬Ôò¿ÉÄܽ« "memory" ¹Ø¼ü×ÖÌí¼Óµ½ÐÞÊμĴæÆ÷ÁбíÖС£ÕâÑù¾Í¸æËß GCC ²»ÒªÔÚ²»Í¬Ö¸ÁîÖ®¼ä½«ÄÚ´æÖµ¸ßËÙ»º´æÔڼĴæÆ÷ÖС£
·ÊÇ·ñÔÊÐí²Ù×÷ÊýλÓڼĴæÆ÷ÖУ¬ÒÔ¼°Ëü¿ÉÒÔ°üÀ¨ÔÚÄÄЩÖÖÀàµÄ¼Ä´æÆ÷ÖÐ
·²Ù×÷ÊýÊÇ·ñ¿ÉÒÔÊÇÄÚ´æÒýÓã¬ÒÔ¼°ÔÚÕâÖÖÇé¿öÏÂʹÓÃÄÄЩÖÖÀàµÄµØÖ·
·²Ù×÷ÊýÊÇ·ñ¿ÉÒÔÊÇÁ¢¼´Êý
Ô¼Êø»¹ÒªÇóÁ½¸ö²Ù×÷ÊýÆ¥Åä¡£
³£ÓÃÔ¼Êø
ÔÚ¿ÉÓõ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 ÖС£¸ÃÔ¼Êø¿ÉÒÔÓÃÓÚÒÔÏÂÇé¿ö£º
·ÊäÈë´Ó±äÁ¿ÖжÁÈ¡£¬»òÕß±äÁ¿±»Ð޸ĺó£¬ÐÞ¸Äд»Øµ½Í¬Ò»±äÁ¿ÖÐ
·²»ÐèÒª½«ÊäÈë²Ù×÷ÊýºÍÊä³ö²Ù×÷ÊýµÄʵÀý·Ö¿ª
·Ê¹ÓÃÆ¥ÅäÔ¼Êø×îÖØÒªµÄÒâÒåÔÚÓÚËüÃÇ¿ÉÒÔµ¼ÖÂÓÐЧµØÊ¹ÓÿÉÓüĴæÆ÷¡£
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" ÄÚ²¿Ê¹ÓüĴæÆ÷£¨ÎÞÂÛÊÇÃ÷È·»¹ÊÇÒþº¬µØ£©£¬¼È²»³öÏÖÔÚÊäÈë²Ù×÷ÊýÁбíÖУ¬Ò²²»³öÏÖÔÚÊä³ö²Ù×÷ÊýÁбíÖУ¬±ØÐ뽫ËüÁÐΪÐÞÊμĴæÆ÷¡£
Ò»¡¢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"
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¡£
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 [ÃüÁîÐÐÑ¡Ïî] ÔʼÎļþ ÐÂÎļþ
³£ÓÃÃüÁîÐÐÑ¡ÏîÈçÏ£º
¡¡¡¡¡¡-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ÓÃÒ»¸öºó׺Ϊ¡°,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Îļþ½øÐи÷ÖÖ¾«Ï¸µÄά»¤£¬×îΪ¸´ÔÓ¡£
#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Ïà¹ØµÄÈô¸É¸ÅÄîºÍÊõÓ
¡¡¡¡¡¡¡¡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
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 Îļþ£¬Õâ¸öÎļþÆäʵÊÇ×°ÔØÆ÷ÄÚ²¿Ê¹ÓõÄÎļþÖ®Ò»¡£
¿ÉÒÔʹÓÃÐí¶à»·¾³±äÁ¿¿ØÖƹ²Ïí¿â×