audk/AppPkg
lpleahy f32df6f658 Update applications to display correct error for gethostbyaddr and gethostbyname. These APIs use h_errno instead of errno, see documentation at: http://www.linuxhowtos.org/manpages/3p/gethostbyaddr.htm
Signed-off-by: lpleahy

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12511 6f19259b-4bc3-4df7-8a09-765794883524
2011-10-04 18:31:40 +00:00
..
Applications Update applications to display correct error for gethostbyaddr and gethostbyname. These APIs use h_errno instead of errno, see documentation at: http://www.linuxhowtos.org/manpages/3p/gethostbyaddr.htm 2011-10-04 18:31:40 +00:00
AppPkg.dsc
ReadMe.txt Add plain-text ReadMe files and delete the PDF version. 2011-08-02 23:09:06 +00:00

ReadMe.txt

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

                           EDK II Standard Libraries

                                    ReadMe

                                 Beta Release

                               4:03 PM 8/2/2011





OVERVIEW

========

This document describes the EDK II specific aspects of installing, building, and

using the Standard C Library component of the EDK II Application Development

Kit, EADK.



The EADK is comprised of three packages: AppPkg, StdLib, and StdLibPrivateInternalFiles.



  AppPkg   This package contains applications which demonstrate use of the

           Standard C Library.

           These applications reside in AppPkg/Applications.



      Enquire  This is a program that determines many properties of the

               C compiler and the target machine that Enquire is run on.  The

               only changes required to port this 1990s era Unix program to

               EDK II were the addition of eight pragmas to enquire.c in

               order to disable some Microsoft VC++ specific warnings.



      Hello    This is a very simple EDK II native application that doesn't use

               any features of the Standard C Library.



      Main     This application is functionally identical to Hello, except that

               it uses the Standard C Library to provide a main() entry point.



      Python   A port of the Python-2.7.1 interpreter for UEFI.  This

               application is disabled by default.  Un-comment the line for

               PythonCore.inf in the [Components] section of AppPkg.dsc to

               enable building Python.



      Sockets  A collection of applications demonstrating use of the

               EDK II Socket Libraries.  These applications include:



               *   DataSink

               *   DataSource

               *   GetHostByAddr

               *   GetHostByDns

               *   GetHostByName

               *   GetNetByAddr

               *   GetNetByName

               *   GetServByName

               *   GetServByPort

               *   RecvDgram

               *   SetHostName

               *   SetSockOpt

               *   TftpServer

               *   WebServer



  StdLib   The StdLib package contains the standard header files as well as

           implementations of the standard libraries.



  StdLibPrivateInternalFiles  The contents of this package are for the

           exclusive use of the library implementations in StdLib.  Please do

           not use anything from this package in your application or else

           unexpected behavior may occur.

           This package may be removed in a future release.





RELEASE NOTES

=============

This release of the EADK has some restrictions, as described below.



    1.	Only the Microsoft VS2005 and VS2008, Intel C Compiler 10.1 (or later),

        GCC 4.3 (mingw32), GCC 4.4, and GCC 4.5 C compilers are supported for

        Ia32 or X64 CPU architectures.

        

    2.	The target machine must be running firmware which provides the

        UEFI 2.3 HII protocol.

        

    3.	The EADK has not been through Intel's Quality Assurance process. This

        means that specified standards compliance has not been validated, nor

        has it undergone formal functionality testing.

        

    4.	Applications must be launched from within the EFI Shell.

    

    5.	All file paths must use the forward slash, '/', as the separator

        character.

        

    6.	Absolute file paths may optionally be prefixed by a volume specifier

        such as "FS0:".  The volume specifier is separated from the remainder

        of the path by a single colon ':'.  The volume specifier must be one of

        the Shell's mapped volume names as shown by the "map" command.

        

    7.	Absolute file paths that don't begin with a volume specifier;

        e.g. paths that begin with "/", are relative to the currently selected

        volume.  When the EFI Shell starts, there is NO selected volume.

        

    8.	The tmpfile(), and related, functions require that the current volume

        have a temporary directory as specified in <paths.h>.  This directory

        is specified by macro _PATH_TMP.



The Standard C Library provided by this package is a "hosted" implementation

conforming to the ISO/IEC 9899-1990 C Language Standard with Addendum 1. This

is commonly referred to as the "C 95" specification or ISO/IEC 9899:199409.

The following instructions assume that you have an existing EDK II or UDK 2010

source tree that has been configured to build with your tool chain.  For

convenience, it is assumed that your EDK II source tree is located at

C:\Source\Edk2.





INSTALLATION

============

The EADK is integrated within the EDK II source tree and is included with

current EDK II check-outs.  If they are missing from your tree, they may be

installed by extracting, downloading or copying them to the root of your EDK II

source tree.  The three package directories should be peers to the Conf,

MdePkg, Nt32Pkg, etc. directories.



The Python 2.7.1 distribution must be downloaded from python.org before the

Python application can be built.  Extracting Python-2.7.1.tgz into the

AppPkg\Applications\Python directory will produce a Python-2.7.1 directory

containing the Python distribution.  Python files that had to be modified for

EDK II are in the AppPkg\Applications\Python\PyMod-2.7.1 directory.  These

files need to be copied into the corresponding directories within Python-2.7.1.



There are some boiler-plate declarations and definitions that need to be

included in your application's INF and DSC build files.  These are described

in the CONFIGURATION section, below.





BUILDING

========

It is not necessary to build the libraries separately from the target

application(s). If the application references the libraries, as described in

USAGE, below; the required libraries will be built as needed.

To build the applications included in AppPkg, one would execute the following

commands within the "Visual Studio Command Prompt" window:



    > cd C:\Source\Edk2

    > .\edksetup.bat

    > build ?a X64 ?p AppPkg\AppPkg.dsc



This will produce the application executables: Enquire.efi, Hello.efi, and

Main.efi in the C:\Source\Edk2\Build\AppPkg\DEBUG_VS2008\X64 directory; with

the DEBUG_VS2008 component being replaced with the actual tool chain and build

type you have selected in Conf\Tools_def.txt. These executables can now be

loaded onto the target platform and executed.



If you examine the AppPkg.dsc file, you will notice that the StdLib package is

referenced in order to resolve the library classes comprising the Standard

C Library.  This, plus referencing the StdLib package in your application's

.inf file is all that is needed to link your application to the standard

libraries.





USAGE

=====

This implementation of the Standard C Library is comprised of 16 separate

libraries in addition to the standard header files. Nine of the libraries are

associated with use of one of the standard headers; thus, if the header is used

in an application, it must be linked with the associated library.  Three

libraries are used to provide the Console and File-system device abstractions.

The libraries and associated header files are described in the following table.



 Library

  Class      Header File(s)    Notes

----------  ----------------  -------------------------------------------------

LibC        -- Use Always --  This library is always required.

LibCtype    ctype.h, wctype.h Character classification and mapping

LibLocale   locale.h          Localization types, macros, and functions

LibMath     math.h            Mathematical functions, types, and macros

LibStdio    stdio.h           Standard Input and Output functions, types, and

                              macros

LibStdLib   stdlib.h          General Utilities for numeric conversion, random

                              num., etc.

LibString   string.h          String copying, concatenation, comparison,

                              & search

LibSignal   signal.h          Functions and types for handling run-time

                              conditions

LibTime     time.h            Time and Date types, macros, and functions

LibUefi     sys/EfiSysCall.h  Provides the UEFI system interface and

                              "System Calls"

LibWchar    wchar.h           Extended multibyte and wide character utilities

LibNetUtil                    Network address and number manipulation utilities

DevConsole                    Automatically provided  File I/O abstractions for

                              the UEFI Console device.  No need to list this

                              library class in your INF file(s).

DevShell    Add if desired    File I/O abstractions using UEFI shell

                              facilities.  Add this to the application's main

                              INF file if file-system access needed.

DevUtility  -- Do Not Use --  Utility functions used by the Device abstractions

LibGdtoa    -- Do Not Use --  This library is used internally and should not

                              need to be explicitly specified by an

                              application.  It must be defined as one of the

                              available library classes in the application's

                              DSC file.



                         Table 1:  Standard Libraries

                         ============================





These libraries must be fully described in the [LibraryClasses] section of the

application package's DSC file. Then, each individual application needs to

specify which libraries to link to by specifying the Library Class, from the

above table, in the [LibraryClasses] section of the application's INF file. The

AppPkg.dsc, StdLib.dsc, and Enquire.inf files provide good examples of this.

More details are in the CONFIGURATION section, below.



Within the source files of the application, use of the Standard headers and

library functions follow standard C programming practices as formalized by

ISO/IEC 9899:1990, with Addendum 1, (C 95) C language specification.





CONFIGURATION

=============

DSC Files

---------



All EDK II packages which build applications that use the standard libraries

must include some "boilerplate" text in the package's .dsc file.  To make it

easier, and to reduce cut-and-paste errors, the "boilerplate" text has been

consolidated into a single file, StdLib/StdLib.inc, which can be included in

your .dsc file using the !include directive.  The provided AppPkg.dsc and

StdLib.dsc files do this on their last line.



Each affected section of the DSC file is described below.



  [LibraryClasses]

    #

    # Common Libraries

    #

    BaseLib|MdePkg/Library/BaseLib/BaseLib.inf

    BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf



    TimerLib|PerformancePkg/Library/DxeTscTimerLib/DxeTscTimerLib.inf

    # To run in an emulation environment, such as NT32, comment out

    # the TimerLib description above and un-comment the line below.

    # TimerLib| MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf



    #

    # C Standard Libraries

    #

    LibC|StdLib/LibC/LibC.inf

    LibStdLib|StdLib/LibC/StdLib/StdLib.inf

    LibString|StdLib/LibC/String/String.inf

    LibWchar|StdLib/LibC/Wchar/Wchar.inf

    LibCType|StdLib/LibC/Ctype/Ctype.inf

    LibTime|StdLib/LibC/Time/Time.inf

    LibStdio|StdLib/LibC/Stdio/Stdio.inf

    LibGdtoa|StdLib/LibC/gdtoa/gdtoa.inf

    LibLocale|StdLib/LibC/Locale/Locale.inf

    LibUefi|StdLib/LibC/Uefi/Uefi.inf

    LibMath|StdLib/LibC/Math/Math.inf

    LibSignal|StdLib/LibC/Signal/Signal.inf

    LibNetUtil|StdLib/LibC/LibGcc/LibGcc.inf



  # Libraries for device abstractions within the Standard C Library.

  # Applications should not directly access any functions defined

  # in these libraries.

    DevUtility|StdLib/LibC/Uefi/Devices/daUtility.inf

    DevConsole|StdLib/LibC/Uefi/Devices/daConsole.inf

    DevShell|StdLib/LibC/Uefi/Devices/daShell.inf



                     Figure 1: Library Class Descriptions

                     ====================================





Descriptions of the Library Classes comprising the Standard Libraries must be

included in your application package's DSC file, as shown in Figure 1: Library

Class Descriptions, above.



The directives in Figure 2: Package Component Descriptions will create

instances of the BaseLib and BaseMemoryLib library classes that are built

with Link-time-Code-Generation disabled.  This is necessary when using the

Microsoft tool chains in order to allow the library's functions to be

resolved during the second pass of the linker during Link-Time-Code-Generation

of the application.



  [Components]

  # BaseLib and BaseMemoryLib need to be built with the /GL- switch

  # when using the Microsoft tool chains.  This is required so that

  # the library functions can be resolved during the second pass of

  # the linker during link-time-code-generation.

  #

    MdePkg/Library/BaseLib/BaseLib.inf {

      <BuildOptions>

        MSFT:*_*_*_CC_FLAGS = /X /Zc:wchar_t /GL-

    }

    MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf {

      <BuildOptions>

        MSFT:*_*_*_CC_FLAGS = /X /Zc:wchar_t /GL-

    }



                    Figure 2: Package Component Descriptions

                    ========================================





The NULL TimerLib instance must be selected if you desire to run your

application under an emulation environment -- unless there is a supported

TimerLib for that environment.  For example, the InOsEmuPkg provides a

DxeTimerLib which can be used for the TimerLib instance.



The "boilerplate" text in StdLib.inc will automatically adjust which Timer

Library is instantiated based upon whether the $(EMULATE) macro has been

defined, or not.



  ###

  # Select the correct TimerLib instance depending upon whether running under

  # an emulation environment, or not.

  !ifndef $(EMULATE)

    # Not running in an Emulation Environment

  [LibraryClasses.IA32.UEFI_APPLICATION]

    TimerLib|PerformancePkg/Library/DxeTscTimerLib/DxeTscTimerLib.inf



  [LibraryClasses.X64.UEFI_APPLICATION]

    TimerLib|PerformancePkg/Library/DxeTscTimerLib/DxeTscTimerLib.inf



  [LibraryClasses.IPF.UEFI_APPLICATION]

    PalLib|MdePkg/Library/UefiPalLib/UefiPalLib.inf

    TimerLib|MdePkg/Library/SecPeiDxeTimerLibCpu/SecPeiDxeTimerLibCpu.inf



  !else

    # Use this instance if Running in an Emulation Environment.

  [LibraryClasses.Common.UEFI_APPLICATION]

    TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf

  !endif



                      Figure 3: Timer Library Selection

                      =================================





Each compiler assumes, by default, that it will be used with standard libraries

and headers provided by the compiler vendor.  Many of these assumptions are

incorrect for the UEFI environment.  By including a BuildOptions section, as

shown in Figure 3: Package Build Options, these assumptions can be

tailored for compatibility with UEFI and the EDK II Standard Libraries.



  [BuildOptions]

    INTEL:*_*_IA32_CC_FLAGS  = /Qfreestanding

     MSFT:*_*_IA32_CC_FLAGS  = /X /Zc:wchar_t

      GCC:*_*_IA32_CC_FLAGS  = /ffreestanding ?nostdinc ?nostdlib



  # The Build Options, below, are only used when building the C library

  # to be run under an emulation environment.  The clock() system call

  # is modified to return -1 indicating that it is unsupported.

  # Just un-comment the lines below and select the correct

  # TimerLib instance, above.



    # INTEL:*_*_IA32_CC_FLAGS  = /D NT32dvm

    #  MSFT:*_*_IA32_CC_FLAGS  = /D NT32dvm

    #   GCC:*_*_IA32_CC_FLAGS  = -DNT32dvm



                        Figure 4: Package Build Options

                        ===============================



The "boilerplate" text can be included using a !include directive in the

package's .dsc file.  The provided AppPkg.dsc and StdLib.dsc files include

the "boilerplate" text as follows:



  # Include Boilerplate text required for building with the Standard Libraries.

  #

  #############################################################################

  !include StdLib/StdLib.inc



                      Figure 5: "Boilerplate" Inclusion

                      =================================





INF Files

=========

The INF files for most modules will not require special directives in order to

support the Standard Libraries.  The two cases which could occur are described

below.



  [LibraryClasses]

    UefiLib

    LibC

    LibString

    LibStdio

    DevShell

  

                      Figure 6: Module Library Classes

                      ================================





Modules of type UEFI_APPLICATION that perform file I/O should include library

class DevShell.  Including this library class will allow file operations to be

handled by the UEFI Shell.  Without this class, only Console I/O is permitted.



 [BuildOptions]

  INTEL:*_*_*_CC_FLAGS          = /Qdiag-disable:181,186

   MSFT:*_*_*_CC_FLAGS          = /Oi- /wd4018 /wd4131

    GCC:*_*_IPF_SYMRENAME_FLAGS = --redefine-syms=Rename.txt

    

                        Figure 7: Module Build Options

                        ==============================





An application's INF file may need to include a [BuildOptions] section

specifying additional compiler and linker flags necessary to allow the

application to be built. Usually, this section is not needed.  When building

code from external sources, though, it may be necessary to disable some

warnings or enable/disable some compiler features.





IMPLEMENTATION-Specific Features

================================

It is very strongly recommended that applications not use the long or

unsigned long types. The size of this type varies between compilers and is one

of the less portable aspects of C. Instead, one should use the UEFI defined

types whenever possible. Use of these types, listed below for reference,

ensures that the declared objects have unambiguous, explicitly declared, sizes

and characteristics.



        UINT64   INT64     UINT32   INT32   UINT16   CHAR16

        INT16    BOOLEAN   UINT8    CHAR8   INT8

        UINTN    INTN                       PHYSICALADDRESS



There are similar types declared in sys/types.h and related files.



The types UINTN and INTN have the native width of the target processor

architecture. Thus, INTN on IA32 has a width of 32 bits while INTN on X64 and

IPF has a width of 64 bits.



For maximum portability, data objects intended to hold addresses should be

declared with type intptr_t or uintptr_t. These types, declared in

sys/stdint.h, can be used to create objects capable of holding pointers. Note

that these types will generate different sized objects on different processor

architectures.  If a constant size across all processors and compilers is

needed, use type PHYSICAL_ADDRESS.



Though not specifically required by the ISO/IEC 9899 standard, this

implementation of the Standard C Library provides the following system calls

which are declared in sys/EfiSysCall.h.



          close   dup      dup2     fcntl

          fstat   getcwd   ioctl    isatty

          lseek   lstat    mkdir    open

          poll    read     rename   rmdir

          stat    unlink   write



The open function will accept file names of "stdin:", "stdout:", and "stderr:"

which cause the respective streams specified in the UEFI System Table to be

opened.  Normally, these are associated with the console device.  When the

application is first started, these streams are automatically opened on File

Descriptors 0, 1, and 2 respectively.