1@node Maintenance, Platform, Installation, Top 2@c %MENU% How to enhance and port the GNU C Library 3@appendix Library Maintenance 4 5@menu 6* Source Layout:: How to add new functions or header files 7 to the GNU C Library. 8* Symbol handling:: How to handle symbols in the GNU C Library. 9* Porting:: How to port the GNU C Library to 10 a new machine or operating system. 11@end menu 12 13@node Source Layout 14@appendixsec Adding New Functions 15 16The process of building the library is driven by the makefiles, which 17make heavy use of special features of GNU @code{make}. The makefiles 18are very complex, and you probably don't want to try to understand them. 19But what they do is fairly straightforward, and only requires that you 20define a few variables in the right places. 21 22The library sources are divided into subdirectories, grouped by topic. 23 24The @file{string} subdirectory has all the string-manipulation 25functions, @file{math} has all the mathematical functions, etc. 26 27Each subdirectory contains a simple makefile, called @file{Makefile}, 28which defines a few @code{make} variables and then includes the global 29makefile @file{Rules} with a line like: 30 31@smallexample 32include ../Rules 33@end smallexample 34 35@noindent 36The basic variables that a subdirectory makefile defines are: 37 38@table @code 39@item subdir 40The name of the subdirectory, for example @file{stdio}. 41This variable @strong{must} be defined. 42 43@item headers 44The names of the header files in this section of the library, 45such as @file{stdio.h}. 46 47@item routines 48@itemx aux 49The names of the modules (source files) in this section of the library. 50These should be simple names, such as @samp{strlen} (rather than 51complete file names, such as @file{strlen.c}). Use @code{routines} for 52modules that define functions in the library, and @code{aux} for 53auxiliary modules containing things like data definitions. But the 54values of @code{routines} and @code{aux} are just concatenated, so there 55really is no practical difference. 56 57@item tests 58The names of test programs for this section of the library. These 59should be simple names, such as @samp{tester} (rather than complete file 60names, such as @file{tester.c}). @w{@samp{make tests}} will build and 61run all the test programs. If a test program needs input, put the test 62data in a file called @file{@var{test-program}.input}; it will be given to 63the test program on its standard input. If a test program wants to be 64run with arguments, put the arguments (all on a single line) in a file 65called @file{@var{test-program}.args}. Test programs should exit with 66zero status when the test passes, and nonzero status when the test 67indicates a bug in the library or error in building. 68 69@item others 70The names of ``other'' programs associated with this section of the 71library. These are programs which are not tests per se, but are other 72small programs included with the library. They are built by 73@w{@samp{make others}}. 74 75@item install-lib 76@itemx install-data 77@itemx install 78Files to be installed by @w{@samp{make install}}. Files listed in 79@samp{install-lib} are installed in the directory specified by 80@samp{libdir} in @file{configparms} or @file{Makeconfig} 81(@pxref{Installation}). Files listed in @code{install-data} are 82installed in the directory specified by @samp{datadir} in 83@file{configparms} or @file{Makeconfig}. Files listed in @code{install} 84are installed in the directory specified by @samp{bindir} in 85@file{configparms} or @file{Makeconfig}. 86 87@item distribute 88Other files from this subdirectory which should be put into a 89distribution tar file. You need not list here the makefile itself or 90the source and header files listed in the other standard variables. 91Only define @code{distribute} if there are files used in an unusual way 92that should go into the distribution. 93 94@item generated 95Files which are generated by @file{Makefile} in this subdirectory. 96These files will be removed by @w{@samp{make clean}}, and they will 97never go into a distribution. 98 99@item extra-objs 100Extra object files which are built by @file{Makefile} in this 101subdirectory. This should be a list of file names like @file{foo.o}; 102the files will actually be found in whatever directory object files are 103being built in. These files will be removed by @w{@samp{make clean}}. 104This variable is used for secondary object files needed to build 105@code{others} or @code{tests}. 106@end table 107 108@menu 109* Platform: Adding Platform-specific. Adding platform-specific 110 features. 111@end menu 112 113@node Adding Platform-specific 114@appendixsubsec Platform-specific types, macros and functions 115 116It's sometimes necessary to provide nonstandard, platform-specific 117features to developers. The C library is traditionally the 118lowest library layer, so it makes sense for it to provide these 119low-level features. However, including these features in the C 120library may be a disadvantage if another package provides them 121as well as there will be two conflicting versions of them. Also, 122the features won't be available to projects that do not use 123@theglibc{} but use other GNU tools, like GCC. 124 125The current guidelines are: 126@itemize @bullet 127@item 128If the header file provides features that only make sense on a particular 129machine architecture and have nothing to do with an operating system, then 130the features should ultimately be provided as GCC built-in functions. Until 131then, @theglibc{} may provide them in the header file. When the GCC built-in 132functions become available, those provided in the header file should be made 133conditionally available prior to the GCC version in which the built-in 134function was made available. 135 136@item 137If the header file provides features that are specific to an operating system, 138both GCC and @theglibc{} could provide it, but @theglibc{} is preferred 139as it already has a lot of information about the operating system. 140 141@item 142If the header file provides features that are specific to an operating system 143but used by @theglibc{}, then @theglibc{} should provide them. 144@end itemize 145 146The general solution for providing low-level features is to export them as 147follows: 148 149@itemize @bullet 150@item 151A nonstandard, low-level header file that defines macros and inline 152functions should be called @file{sys/platform/@var{name}.h}. 153 154@item 155Each header file's name should include the platform name, to avoid 156users thinking there is anything in common between the different 157header files for different platforms. For example, a 158@file{sys/platform/@var{arch}.h} name such as 159@file{sys/platform/ppc.h} is better than @file{sys/platform.h}. 160 161@item 162A platform-specific header file provided by @theglibc{} should coordinate 163with GCC such that compiler built-in versions of the functions and macros are 164preferred if available. This means that user programs will only ever need to 165include @file{sys/platform/@var{arch}.h}, keeping the same names of types, 166macros, and functions for convenience and portability. 167 168@item 169Each included symbol must have the prefix @code{__@var{arch}_}, such as 170@code{__ppc_get_timebase}. 171@end itemize 172 173 174The easiest way to provide a header file is to add it to the 175@code{sysdep_headers} variable. For example, the combination of 176Linux-specific header files on PowerPC could be provided like this: 177 178@smallexample 179sysdep_headers += sys/platform/ppc.h 180@end smallexample 181 182Then ensure that you have added a @file{sys/platform/ppc.h} 183header file in the machine-specific directory, e.g., 184@file{sysdeps/powerpc/sys/platform/ppc.h}. 185 186 187@node Symbol handling 188@appendixsec Symbol handling in the GNU C Library 189 190@menu 191* 64-bit time symbol handling :: How to handle 64-bit time related 192 symbols in the GNU C Library. 193@end menu 194 195@node 64-bit time symbol handling 196@appendixsubsec 64-bit time symbol handling in the GNU C Library 197 198With respect to time handling, @glibcadj{} configurations fall in two 199classes depending on the value of @code{__TIMESIZE}: 200 201@table @code 202 203@item @code{__TIMESIZE == 32} 204 205These @dfn{dual-time} configurations have both 32-bit and 64-bit time 206support. 32-bit time support provides type @code{time_t} and cannot 207handle dates beyond @dfn{Y2038}. 64-bit time support provides type 208@code{__time64_t} and can handle dates beyond @dfn{Y2038}. 209 210In these configurations, time-related types have two declarations, 211a 64-bit one, and a 32-bit one; and time-related functions generally 212have two definitions: a 64-bit one, and a 32-bit one which is a wrapper 213around the former. Therefore, for every @code{time_t}-related symbol, 214there is a corresponding @code{__time64_t}-related symbol, the name of 215which is usually the 32-bit symbol's name with @code{__} (a double 216underscore) prepended and @code{64} appended. For instance, the 21764-bit-time counterpart of @code{clock_gettime} is 218@code{__clock_gettime64}. 219 220@item @code{__TIMESIZE == 64} 221 222These @dfn{single-time} configurations only have a 64-bit @code{time_t} 223and related functions, which can handle dates beyond 2038-01-19 22403:14:07 (aka @dfn{Y2038}). 225 226In these configurations, time-related types only have a 64-bit 227declaration; and time-related functions only have one 64-bit definition. 228However, for every @code{time_t}-related symbol, there is a 229corresponding @code{__time64_t}-related macro, the name of which is 230derived as in the dual-time configuration case, and which expands to 231the symbol's name. For instance, the macro @code{__clock_gettime64} 232expands to @code{clock_gettime}. 233 234These macros are purely internal to @theglibc{} and exist only so that 235a single definition of the 64-bit time functions can be used on both 236single-time and dual-time configurations, and so that glibc code can 237freely call the 64-bit functions internally in all configurations. 238 239@end table 240 241@c The following paragraph should be removed once external interfaces 242@c get support for both time sizes. 243 244Note: at this point, 64-bit time support in dual-time configurations is 245work-in-progress, so for these configurations, the public API only makes 246the 32-bit time support available. In a later change, the public API 247will allow user code to choose the time size for a given compilation 248unit. 249 25064-bit variants of time-related types or functions are defined for all 251configurations and use 64-bit-time symbol names (for dual-time 252configurations) or macros (for single-time configurations). 253 25432-bit variants of time-related types or functions are defined only for 255dual-time configurations. 256 257Here is an example with @code{localtime}: 258 259Function @code{localtime} is declared in @file{time/time.h} as 260@smallexample 261extern struct tm *localtime (const time_t *__timer) __THROW; 262libc_hidden_proto (localtime) 263@end smallexample 264 265For single-time configurations, @code{__localtime64} is a macro which 266evaluates to @code{localtime}; for dual-time configurations, 267@code{__localtime64} is a function similar to @code{localtime} except 268it uses Y2038-proof types: 269@smallexample 270#if __TIMESIZE == 64 271# define __localtime64 localtime 272#else 273extern struct tm *__localtime64 (const __time64_t *__timer) __THROW; 274libc_hidden_proto (__localtime64) 275#endif 276@end smallexample 277 278(note: type @code{time_t} is replaced with @code{__time64_t} because 279@code{time_t} is not Y2038-proof, but @code{struct tm} is not 280replaced because it is already Y2038-proof.) 281 282The 64-bit-time implementation of @code{localtime} is written as follows 283and is compiled for both dual-time and single-time configuration classes. 284 285@smallexample 286struct tm * 287__localtime64 (const __time64_t *t) 288@{ 289 return __tz_convert (*t, 1, &_tmbuf); 290@} 291libc_hidden_def (__localtime64) 292@end smallexample 293 294The 32-bit-time implementation is a wrapper and is only compiled for 295dual-time configurations: 296 297@smallexample 298#if __TIMESIZE != 64 299 300struct tm * 301localtime (const time_t *t) 302@{ 303 __time64_t t64 = *t; 304 return __localtime64 (&t64); 305@} 306libc_hidden_def (localtime) 307 308#endif 309@end smallexample 310 311@node Porting 312@appendixsec Porting @theglibc{} 313 314@Theglibc{} is written to be easily portable to a variety of 315machines and operating systems. Machine- and operating system-dependent 316functions are well separated to make it easy to add implementations for 317new machines or operating systems. This section describes the layout of 318the library source tree and explains the mechanisms used to select 319machine-dependent code to use. 320 321All the machine-dependent and operating system-dependent files in the 322library are in the subdirectory @file{sysdeps} under the top-level 323library source directory. This directory contains a hierarchy of 324subdirectories (@pxref{Hierarchy Conventions}). 325 326Each subdirectory of @file{sysdeps} contains source files for a 327particular machine or operating system, or for a class of machine or 328operating system (for example, systems by a particular vendor, or all 329machines that use IEEE 754 floating-point format). A configuration 330specifies an ordered list of these subdirectories. Each subdirectory 331implicitly appends its parent directory to the list. For example, 332specifying the list @file{unix/bsd/vax} is equivalent to specifying the 333list @file{unix/bsd/vax unix/bsd unix}. A subdirectory can also specify 334that it implies other subdirectories which are not directly above it in 335the directory hierarchy. If the file @file{Implies} exists in a 336subdirectory, it lists other subdirectories of @file{sysdeps} which are 337appended to the list, appearing after the subdirectory containing the 338@file{Implies} file. Lines in an @file{Implies} file that begin with a 339@samp{#} character are ignored as comments. For example, 340@file{unix/bsd/Implies} contains: 341@smallexample 342# BSD has Internet-related things. 343unix/inet 344@end smallexample 345@noindent 346and @file{unix/Implies} contains: 347@need 300 348@smallexample 349posix 350@end smallexample 351 352@noindent 353So the final list is @file{unix/bsd/vax unix/bsd unix/inet unix posix}. 354 355@file{sysdeps} has a ``special'' subdirectory called @file{generic}. It 356is always implicitly appended to the list of subdirectories, so you 357needn't put it in an @file{Implies} file, and you should not create any 358subdirectories under it intended to be new specific categories. 359@file{generic} serves two purposes. First, the makefiles do not bother 360to look for a system-dependent version of a file that's not in 361@file{generic}. This means that any system-dependent source file must 362have an analogue in @file{generic}, even if the routines defined by that 363file are not implemented on other platforms. Second, the @file{generic} 364version of a system-dependent file is used if the makefiles do not find 365a version specific to the system you're compiling for. 366 367If it is possible to implement the routines in a @file{generic} file in 368machine-independent C, using only other machine-independent functions in 369the C library, then you should do so. Otherwise, make them stubs. A 370@dfn{stub} function is a function which cannot be implemented on a 371particular machine or operating system. Stub functions always return an 372error, and set @code{errno} to @code{ENOSYS} (Function not implemented). 373@xref{Error Reporting}. If you define a stub function, you must place 374the statement @code{stub_warning(@var{function})}, where @var{function} 375is the name of your function, after its definition. This causes the 376function to be listed in the installed @code{<gnu/stubs.h>}, and 377makes GNU ld warn when the function is used. 378 379Some rare functions are only useful on specific systems and aren't 380defined at all on others; these do not appear anywhere in the 381system-independent source code or makefiles (including the 382@file{generic} directory), only in the system-dependent @file{Makefile} 383in the specific system's subdirectory. 384 385If you come across a file that is in one of the main source directories 386(@file{string}, @file{stdio}, etc.), and you want to write a machine- or 387operating system-dependent version of it, move the file into 388@file{sysdeps/generic} and write your new implementation in the 389appropriate system-specific subdirectory. Note that if a file is to be 390system-dependent, it @strong{must not} appear in one of the main source 391directories. 392 393There are a few special files that may exist in each subdirectory of 394@file{sysdeps}: 395 396@comment Blank lines after items make the table look better. 397@table @file 398@item Makefile 399 400A makefile for this machine or operating system, or class of machine or 401operating system. This file is included by the library makefile 402@file{Makerules}, which is used by the top-level makefile and the 403subdirectory makefiles. It can change the variables set in the 404including makefile or add new rules. It can use GNU @code{make} 405conditional directives based on the variable @samp{subdir} (see above) to 406select different sets of variables and rules for different sections of 407the library. It can also set the @code{make} variable 408@samp{sysdep-routines}, to specify extra modules to be included in the 409library. You should use @samp{sysdep-routines} rather than adding 410modules to @samp{routines} because the latter is used in determining 411what to distribute for each subdirectory of the main source tree. 412 413Each makefile in a subdirectory in the ordered list of subdirectories to 414be searched is included in order. Since several system-dependent 415makefiles may be included, each should append to @samp{sysdep-routines} 416rather than simply setting it: 417 418@smallexample 419sysdep-routines := $(sysdep-routines) foo bar 420@end smallexample 421 422@need 1000 423@item Subdirs 424 425This file contains the names of new whole subdirectories under the 426top-level library source tree that should be included for this system. 427These subdirectories are treated just like the system-independent 428subdirectories in the library source tree, such as @file{stdio} and 429@file{math}. 430 431Use this when there are completely new sets of functions and header 432files that should go into the library for the system this subdirectory 433of @file{sysdeps} implements. For example, 434@file{sysdeps/unix/inet/Subdirs} contains @file{inet}; the @file{inet} 435directory contains various network-oriented operations which only make 436sense to put in the library on systems that support the Internet. 437 438@item configure 439 440This file is a shell script fragment to be run at configuration time. 441The top-level @file{configure} script uses the shell @code{.} command to 442read the @file{configure} file in each system-dependent directory 443chosen, in order. The @file{configure} files are often generated from 444@file{configure.ac} files using Autoconf. 445 446A system-dependent @file{configure} script will usually add things to 447the shell variables @samp{DEFS} and @samp{config_vars}; see the 448top-level @file{configure} script for details. The script can check for 449@w{@samp{--with-@var{package}}} options that were passed to the 450top-level @file{configure}. For an option 451@w{@samp{--with-@var{package}=@var{value}}} @file{configure} sets the 452shell variable @w{@samp{with_@var{package}}} (with any dashes in 453@var{package} converted to underscores) to @var{value}; if the option is 454just @w{@samp{--with-@var{package}}} (no argument), then it sets 455@w{@samp{with_@var{package}}} to @samp{yes}. 456 457@item configure.ac 458 459This file is an Autoconf input fragment to be processed into the file 460@file{configure} in this subdirectory. @xref{Introduction,,, 461autoconf.info, Autoconf: Generating Automatic Configuration Scripts}, 462for a description of Autoconf. You should write either @file{configure} 463or @file{configure.ac}, but not both. The first line of 464@file{configure.ac} should invoke the @code{m4} macro 465@samp{GLIBC_PROVIDES}. This macro does several @code{AC_PROVIDE} calls 466for Autoconf macros which are used by the top-level @file{configure} 467script; without this, those macros might be invoked again unnecessarily 468by Autoconf. 469@end table 470 471That is the general system for how system-dependencies are isolated. 472@iftex 473The next section explains how to decide what directories in 474@file{sysdeps} to use. @ref{Porting to Unix}, has some tips on porting 475the library to Unix variants. 476@end iftex 477 478@menu 479* Hierarchy Conventions:: The layout of the @file{sysdeps} hierarchy. 480* Porting to Unix:: Porting the library to an average 481 Unix-like system. 482@end menu 483 484@node Hierarchy Conventions 485@appendixsubsec Layout of the @file{sysdeps} Directory Hierarchy 486 487A GNU configuration name has three parts: the CPU type, the 488manufacturer's name, and the operating system. @file{configure} uses 489these to pick the list of system-dependent directories to look for. If 490the @samp{--nfp} option is @emph{not} passed to @file{configure}, the 491directory @file{@var{machine}/fpu} is also used. The operating system 492often has a @dfn{base operating system}; for example, if the operating 493system is @samp{Linux}, the base operating system is @samp{unix/sysv}. 494The algorithm used to pick the list of directories is simple: 495@file{configure} makes a list of the base operating system, 496manufacturer, CPU type, and operating system, in that order. It then 497concatenates all these together with slashes in between, to produce a 498directory name; for example, the configuration @w{@samp{i686-linux-gnu}} 499results in @file{unix/sysv/linux/i386/i686}. @file{configure} then 500tries removing each element of the list in turn, so 501@file{unix/sysv/linux} and @file{unix/sysv} are also tried, among others. 502Since the precise version number of the operating system is often not 503important, and it would be very inconvenient, for example, to have 504identical @file{irix6.2} and @file{irix6.3} directories, 505@file{configure} tries successively less specific operating system names 506by removing trailing suffixes starting with a period. 507 508As an example, here is the complete list of directories that would be 509tried for the configuration @w{@samp{i686-linux-gnu}}: 510 511@smallexample 512sysdeps/i386/elf 513sysdeps/unix/sysv/linux/i386 514sysdeps/unix/sysv/linux 515sysdeps/gnu 516sysdeps/unix/common 517sysdeps/unix/mman 518sysdeps/unix/inet 519sysdeps/unix/sysv/i386/i686 520sysdeps/unix/sysv/i386 521sysdeps/unix/sysv 522sysdeps/unix/i386 523sysdeps/unix 524sysdeps/posix 525sysdeps/i386/i686 526sysdeps/i386/i486 527sysdeps/libm-i387/i686 528sysdeps/i386/fpu 529sysdeps/libm-i387 530sysdeps/i386 531sysdeps/wordsize-32 532sysdeps/ieee754 533sysdeps/libm-ieee754 534sysdeps/generic 535@end smallexample 536 537Different machine architectures are conventionally subdirectories at the 538top level of the @file{sysdeps} directory tree. For example, 539@w{@file{sysdeps/sparc}} and @w{@file{sysdeps/m68k}}. These contain 540files specific to those machine architectures, but not specific to any 541particular operating system. There might be subdirectories for 542specializations of those architectures, such as 543@w{@file{sysdeps/m68k/68020}}. Code which is specific to the 544floating-point coprocessor used with a particular machine should go in 545@w{@file{sysdeps/@var{machine}/fpu}}. 546 547There are a few directories at the top level of the @file{sysdeps} 548hierarchy that are not for particular machine architectures. 549 550@table @file 551@item generic 552As described above (@pxref{Porting}), this is the subdirectory 553that every configuration implicitly uses after all others. 554 555@item ieee754 556This directory is for code using the IEEE 754 floating-point format, 557where the C type @code{float} is IEEE 754 single-precision format, and 558@code{double} is IEEE 754 double-precision format. Usually this 559directory is referred to in the @file{Implies} file in a machine 560architecture-specific directory, such as @file{m68k/Implies}. 561 562@item libm-ieee754 563This directory contains an implementation of a mathematical library 564usable on platforms which use @w{IEEE 754} conformant floating-point 565arithmetic. 566 567@item libm-i387 568This is a special case. Ideally the code should be in 569@file{sysdeps/i386/fpu} but for various reasons it is kept aside. 570 571@item posix 572This directory contains implementations of things in the library in 573terms of @sc{POSIX.1} functions. This includes some of the @sc{POSIX.1} 574functions themselves. Of course, @sc{POSIX.1} cannot be completely 575implemented in terms of itself, so a configuration using just 576@file{posix} cannot be complete. 577 578@item unix 579This is the directory for Unix-like things. @xref{Porting to Unix}. 580@file{unix} implies @file{posix}. There are some special-purpose 581subdirectories of @file{unix}: 582 583@table @file 584@item unix/common 585This directory is for things common to both BSD and System V release 4. 586Both @file{unix/bsd} and @file{unix/sysv/sysv4} imply @file{unix/common}. 587 588@item unix/inet 589This directory is for @code{socket} and related functions on Unix systems. 590@file{unix/inet/Subdirs} enables the @file{inet} top-level subdirectory. 591@file{unix/common} implies @file{unix/inet}. 592@end table 593 594@item mach 595This is the directory for things based on the Mach microkernel from CMU 596(including @gnuhurdsystems{}). Other basic operating systems 597(VMS, for example) would have their own directories at the top level of 598the @file{sysdeps} hierarchy, parallel to @file{unix} and @file{mach}. 599@end table 600 601@node Porting to Unix 602@appendixsubsec Porting @theglibc{} to Unix Systems 603 604Most Unix systems are fundamentally very similar. There are variations 605between different machines, and variations in what facilities are 606provided by the kernel. But the interface to the operating system 607facilities is, for the most part, pretty uniform and simple. 608 609The code for Unix systems is in the directory @file{unix}, at the top 610level of the @file{sysdeps} hierarchy. This directory contains 611subdirectories (and subdirectory trees) for various Unix variants. 612 613The functions which are system calls in most Unix systems are 614implemented in assembly code, which is generated automatically from 615specifications in files named @file{syscalls.list}. There are several 616such files, one in @file{sysdeps/unix} and others in its subdirectories. 617Some special system calls are implemented in files that are named with a 618suffix of @samp{.S}; for example, @file{_exit.S}. Files ending in 619@samp{.S} are run through the C preprocessor before being fed to the 620assembler. 621 622These files all use a set of macros that should be defined in 623@file{sysdep.h}. The @file{sysdep.h} file in @file{sysdeps/unix} 624partially defines them; a @file{sysdep.h} file in another directory must 625finish defining them for the particular machine and operating system 626variant. See @file{sysdeps/unix/sysdep.h} and the machine-specific 627@file{sysdep.h} implementations to see what these macros are and what 628they should do. 629 630The system-specific makefile for the @file{unix} directory 631(@file{sysdeps/unix/Makefile}) gives rules to generate several files 632from the Unix system you are building the library on (which is assumed 633to be the target system you are building the library @emph{for}). All 634the generated files are put in the directory where the object files are 635kept; they should not affect the source tree itself. The files 636generated are @file{ioctls.h}, @file{errnos.h}, @file{sys/param.h}, and 637@file{errlist.c} (for the @file{stdio} section of the library). 638 639@ignore 640@c This section might be a good idea if it is finished, 641@c but there's no point including it as it stands. --rms 642@c @appendixsec Compatibility with Traditional C 643 644@c ??? This section is really short now. Want to keep it? --roland 645 646@c It's not anymore true. glibc 2.1 cannot be used with K&R compilers. 647@c --drepper 648 649Although @theglibc{} implements the @w{ISO C} library facilities, you 650@emph{can} use @theglibc{} with traditional, ``pre-ISO'' C 651compilers. However, you need to be careful because the content and 652organization of the @glibcadj{} header files differs from that of 653traditional C implementations. This means you may need to make changes 654to your program in order to get it to compile. 655@end ignore 656