| Chapter 0 | Preface | i |
|---|---|---|
| Audience | ii | |
| Organization | ii | |
| Operating System Versions | ii | |
| Conventions used in this book | iii | |
| Describing the keyboard | iv | |
| Terminology | iv | |
| Acknowledgements | v | |
| Part I | 1 | |
| Chapter 1 | Introduction | 1 |
| What is porting? | 1 | |
| How long does it take? | 2 | |
| Why we need to port | 3 | |
| Unix flavours | 3 | |
| Where you fit in | 8 | |
| But can I do it? | 8 | |
| How to use this book | 9 | |
| Part 2 | 10 | |
| Preparations | 11 | |
| Chapter 2 | Unpacking the goodies | 13 |
| Getting the sources | 13 | |
| Software from the Internet | 13 | |
| Choice of archive medium | 14 | |
| Archives | 14 | |
| Archive programs | 15 | |
| Living with tar | 15 | |
| Compression programs | 20 | |
| Encoded files | 20 | |
| Split archives | 21 | |
| What's that archive? | 21 | |
| Identifying archives | 23 | |
| What's in that archive? | 25 | |
| README | 25 | |
| INSTALL file | 26 | |
| Other files | 27 | |
| Chapter 3 | Care and feeding of source trees | 29 |
| Updating old archives | 29 | |
| Patch | 30 | |
| Pruning the tree | 38 | |
| Save the cleaned archive | 39 | |
| Handling trees on CD-ROM | 39 | |
| Link trees | 39 | |
| Object links on CD-ROM | 41 | |
| Tracking changes to the tree | 42 | |
| Timestamps | 42 | |
| cmp | 44 | |
| An example—updating an existing tree | 45 | |
| Chapter 4 | Package configuration | 47 |
| Installation paths | 48 | |
| Preferred tools | 49 | |
| Conveying configuration information | 49 | |
| What do I need to change? | 52 | |
| Creating configuration information | 52 | |
| Multiple Makefile targets | 53 | |
| Manual configuration | 53 | |
| Configuration scripts | 54 | |
| GNU package configuration | 55 | |
| imake | 56 | |
| Chapter 5 | Building the package | 59 |
| Preparation | 59 | |
| Make sure you have enough space | 59 | |
| Use a windowing system | 59 | |
| Keep a log file | 60 | |
| Save make output | 61 | |
| Standard targets | 62 | |
| make depend | 62 | |
| make all | 62 | |
| make install | 63 | |
| make clean | 63 | |
| make stamp-halfway | 63 | |
| Problems running make | 63 | |
| Missing Makefile or targets | 64 | |
| Missing targets | 66 | |
| make doesn't understand the Makefile | 66 | |
| make refers to non-existent files | 67 | |
| Problems with subordinate makes | 68 | |
| make doesn't rebuild correctly | 68 | |
| Incorrect dependencies | 68 | |
| No dependency on Makefile | 68 | |
| Other errors from make | 69 | |
| Trailing blanks in variables | 69 | |
| Comments in command lists | 69 | |
| make forgets the current directory | 70 | |
| Missing separator - stop | 70 | |
| Commands commence before first target | 70 | |
| Syntax errors from the shell | 71 | |
| Circular dependency dropped | 71 | |
| Nonsensical targets | 71 | |
| Unable to stop make | 71 | |
| Problems with make clean | 72 | |
| Subordinate makes | 72 | |
| Incorrect continuation lines | 73 | |
| Prompts in Makefiles | 74 | |
| Arg list too long | 74 | |
| Modifying Makefiles | 76 | |
| Chapter 6 | Running the compiler | 77 |
| Compiler warnings | 77 | |
| Implicit return type | 79 | |
| Inconsistent function returns | 79 | |
| Uninitialized variables | 80 | |
| Signed comparisons of unsigned values | 80 | |
| Character subscripts to arrays | 80 | |
| Dequalifying types | 81 | |
| Increasing alignment requirements | 81 | |
| Implicit conversions between enums | 82 | |
| Incomplete switch statements | 82 | |
| long indices for switch | 82 | |
| Changing non-volatile automatic variables | 82 | |
| Invalid keyword sequences in declarations | 83 | |
| Trigraphs | 83 | |
| Nested comments | 83 | |
| Missing parentheses | 83 | |
| Functions with embedded extern definitions | 84 | |
| Compiler errors | 84 | |
| Undefined symbols | 84 | |
| Conflicts between preprocessor and compiler variables | 85 | |
| Other preprocessors | 88 | |
| Syntax errors | 88 | |
| Virtual memory exhausted | 89 | |
| Compiler limits exceeded | 89 | |
| Running compiler passes individually | 89 | |
| Incorrect code from compiler | 90 | |
| Chapter 7 | Documentation | 91 |
| Preformatted documentation | 91 | |
| PostScript | 92 | |
| .dvi format | 94 | |
| Format conversion | 94 | |
| roff and friends | 94 | |
| formatting with nroff or troff | 95 | |
| Other roff-related programs | 98 | |
| Man pages | 99 | |
| man history | 99 | |
| TeX | 101 | |
| GNU Info and Texinfo | 103 | |
| The World-Wide Web | 103 | |
| Chapter 8 | Testing the results | 105 |
| What makes ported programs fail? | 105 | |
| A strategy for testing | 106 | |
| Symbolic debuggers | 107 | |
| Libraries and debugging information | 109 | |
| Limitations of debuggers | 119 | |
| Tracing system calls | 120 | |
| trace | 120 | |
| ktrace | 122 | |
| truss | 123 | |
| Tracing through fork | 124 | |
| Tracing network traffic | 124 | |
| Chapter 9 | Installation | 125 |
| make install | 126 | |
| Configuring the installed package | 127 | |
| Installing the correct files | 127 | |
| To replace or not to replace? | 127 | |
| Updating | 128 | |
| install | 128 | |
| Installing documentation | 130 | |
| Man pages. | 130 | |
| GNU info | 132 | |
| Removing installed software | 133 | |
| Removing software manually | 133 | |
| Removing too much | 137 | |
| Keeping track of installed software | 137 | |
| System V pkgadd | 138 | |
| pkginfo | 138 | |
| pkgmap | 138 | |
| Package subdirectories | 139 | |
| pkgadd | 140 | |
| Removing packages | 140 | |
| Making installable packages | 140 | |
| Making a prototype file | 141 | |
| Running pkgmk | 142 | |
| Chapter 10 | Where to go from here | 143 |
| Reporting modifications | 143 | |
| diff | 144 | |
| Saving the archive | 148 | |
| Not done after all? | 148 | |
| Part II | Platform dependencies | 151 |
| Software Dependencies | 151 | |
| Chapter 11 | Hardware dependencies | 153 |
| Data types | 153 | |
| Integer sizes | 153 | |
| Floating point types | 154 | |
| Pointer size | 155 | |
| Address space | 155 | |
| Character order | 156 | |
| Data alignment | 158 | |
| Instruction alignment | 160 | |
| Chapter 12 | Kernel dependencies | 161 |
| Interprocess communication | 162 | |
| Pipes | 163 | |
| Sockets | 163 | |
| Other kinds of pipe | 164 | |
| System V IPC | 165 | |
| Miscellaneous system functionality | 168 | |
| exec | 168 | |
| getrlimit and setrlimit | 169 | |
| Process groups | 171 | |
| Real and effective user IDs | 172 | |
| vfork | 174 | |
| wait and friends | 175 | |
| waitpid | 176 | |
| wait3 and wait4 | 177 | |
| Chapter 13 | Signals | 179 |
| Supported signals | 180 | |
| Unreliable and reliable signals | 181 | |
| Signal handlers | 183 | |
| System V.4 signal handlers | 183 | |
| BSD signal handlers | 185 | |
| SIGCLD and SIGCHLD | 186 | |
| Interrupted system calls | 186 | |
| Calling functions from signal handlers | 187 | |
| Current signal implementations | 188 | |
| Seventh Edition signal function | 188 | |
| BSD signal functions | 188 | |
| System V signal functions | 191 | |
| POSIX.1 signal functions | 192 | |
| Signals under Linux | 196 | |
| Other signal-related functions | 196 | |
| sigstack and sigaltstack | 196 | |
| setjmp and longjmp | 197 | |
| kill | 200 | |
| killpg | 201 | |
| raise | 201 | |
| sys_siglist and psignal | 201 | |
| Chapter 14 | File systems | 203 |
| File system structures | 204 | |
| The Berkeley Fast File System | 204 | |
| Other file systems | 205 | |
| Function calls | 206 | |
| chsize | 206 | |
| dup2 | 207 | |
| fchdir and friends | 207 | |
| fcntl | 207 | |
| getdents and getdirentries | 209 | |
| getdtablesize | 210 | |
| ioctl | 211 | |
| lstat | 211 | |
| ltrunc | 211 | |
| mkdir and rmdir | 211 | |
| open | 212 | |
| pathconf and fpathconf | 212 | |
| read | 213 | |
| rename | 213 | |
| revoke | 213 | |
| readdir and friends | 213 | |
| readv and writev | 215 | |
| statfs and statvfs | 216 | |
| symlink | 218 | |
| sysfs | 218 | |
| truncate and ftruncate | 218 | |
| ustat | 219 | |
| utime and utimes | 219 | |
| Non-blocking I/O | 220 | |
| select | 220 | |
| poll | 223 | |
| rdchk | 224 | |
| SIGPOLL | 225 | |
| SIGIO | 225 | |
| File locking | 226 | |
| Lock files | 227 | |
| locking system call | 228 | |
| flock | 229 | |
| fcntl locking | 229 | |
| lockf | 231 | |
| Which locking scheme? | 231 | |
| Memory-mapped files | 232 | |
| mmap | 232 | |
| msync | 233 | |
| munmap | 234 | |
| Chapter 15 | Terminal Drivers | 235 |
| Typical terminal code | 236 | |
| Terminology | 237 | |
| Terminal data structures | 239 | |
| Old terminal driver definitions | 239 | |
| termio and termios structures | 241 | |
| Terminal driver modes | 249 | |
| Canonical mode | 249 | |
| Non-canonical mode | 249 | |
| Raw mode | 250 | |
| Cooked mode | 250 | |
| Cbreak mode | 250 | |
| Emulating old terminal driver modes | 250 | |
| gtty and stty | 251 | |
| The Linux terminal driver | 251 | |
| ioctl | 252 | |
| ioctl request codes | 252 | |
| Terminal ioctls | 254 | |
| Terminal attributes | 256 | |
| Hardware control | 260 | |
| Queue control | 262 | |
| Session control | 263 | |
| Miscellaneous functions | 264 | |
| termios functions | 265 | |
| Direct termios functions | 265 | |
| termios auxiliary functions | 267 | |
| Chapter 16 | Timekeeping | 269 |
| Difficult to use | 270 | |
| Implementations differ | 270 | |
| Differing time formats | 270 | |
| Daylight Savings Time | 271 | |
| National time formats | 271 | |
| Global timekeeping variables | 271 | |
| Getting the current time | 272 | |
| time | 272 | |
| ftime | 272 | |
| gettimeofday | 273 | |
| Setting the current time | 274 | |
| adjtime | 274 | |
| settimeofday | 274 | |
| stime | 274 | |
| Converting time values | 274 | |
| strftime | 275 | |
| strptime | 275 | |
| ascftime | 275 | |
| asctime and asctime_r | 275 | |
| cftime | 276 | |
| ctime and ctime_r | 276 | |
| dysize | 276 | |
| gmtime and gmtime_r | 277 | |
| localtime and localtime_r | 277 | |
| mktime | 277 | |
| timegm | 278 | |
| timelocal | 278 | |
| difftime | 278 | |
| timezone | 278 | |
| tzset | 278 | |
| tzsetwall | 279 | |
| Suspending process execution | 279 | |
| nap | 279 | |
| setitimer | 279 | |
| sleep | 281 | |
| usleep | 281 | |
| select and poll | 281 | |
| Chapter 17 | Header files | 283 |
| ANSI C, POSIX.1, and header files | 283 | |
| ANSI and POSIX.1 restrictions | 285 | |
| Declarations for C++ | 285 | |
| ANSI header files | 288 | |
| Type information | 288 | |
| Classes of header files | 289 | |
| /usr/include/sys | 289 | |
| Problems with header files | 290 | |
| Chapter 18 | Function libraries | 293 |
| Standard library functionality | 293 | |
| alloca | 293 | |
| bcopy | 294 | |
| bzero | 294 | |
| fnmatch | 294 | |
| getcwd and getwd | 295 | |
| gethostname and uname | 295 | |
| index | 296 | |
| malloc | 296 | |
| memmove | 296 | |
| remove | 297 | |
| rindex | 297 | |
| snprintf and vsnprintf | 297 | |
| strcasecmp and strncasecmp | 297 | |
| strdup | 298 | |
| strerror and sys_errlist | 298 | |
| stricmp and strnicmp | 299 | |
| Block memory access functions | 299 | |
| Regular expression routines | 300 | |
| regexpr | 301 | |
| regcmp | 302 | |
| regex: re_comp and re_exec | 303 | |
| Eighth edition regexp | 304 | |
| POSIX.2 regex | 305 | |
| termcap and terminfo | 307 | |
| termcap | 308 | |
| Problems with termcap | 312 | |
| terminfo | 313 | |
| printcap | 316 | |
| Chapter 19 | Make | 317 |
| Terminology | 317 | |
| Additional make features | 318 | |
| Internal variables | 318 | |
| Variables with special meanings | 318 | |
| Special targets | 319 | |
| include directive | 320 | |
| Conditional execution | 320 | |
| Other forms of variable assignment | 321 | |
| Functions | 322 | |
| Multiple targets | 323 | |
| BSD make | 323 | |
| Additional rule delimiter | 323 | |
| Assignment operators | 323 | |
| Variables | 324 | |
| Variable substitution | 325 | |
| Special sources | 327 | |
| Specifying dependencies | 327 | |
| BSD Makefile configuration system | 327 | |
| Chapter 20 | Compilers | 337 |
| The C language | 337 | |
| Kernighan and Ritchie | 338 | |
| UNIX C | 338 | |
| ANSI C | 340 | |
| Differences in the ANSI C preprocessor | 342 | |
| Assertions | 344 | |
| C++ | 345 | |
| Other C dialects | 346 | |
| Intel 8086 memory models | 346 | |
| Other differences in MS-DOS | 347 | |
| Compiler organization | 348 | |
| Other compiler organizations | 350 | |
| The C preprocessor | 350 | |
| Which compiler to use | 350 | |
| Chapter 21 | Object files and friends | 353 |
| Object formats | 354 | |
| The assembler | 358 | |
| Assembler syntax | 358 | |
| Assembler symbols | 359 | |
| Relocation information | 362 | |
| String table and name list | 363 | |
| Examining symbol tables: the nm program | 364 | |
| Debugging information | 367 | |
| The linker | 368 | |
| Function libraries | 369 | |
| Library search | 369 | |
| Shared libraries | 370 | |
| Other linker input | 371 | |
| Merging relocatable files | 372 | |
| Problems with the link editor | 372 | |
| Dumping to object files | 376 | |
| Process initialization and stack frames | 377 | |
| Stack frames | 377 | |
| Setting up the initial parameters | 378 | |
| Initializing C++ programs | 380 | |
| Stack growth during function calls | 381 | |
| Object Archive formats | 383 | |
| Appendix A | Comparative reference to UNIX data types | 385 |
| Appendix B | Compiler options | 391 |
| compiler options | 391 | |
| C compiler options | 391 | |
| gcc dialect options | 405 | |
| gcc debugging options | 407 | |
| gcc warning options | 407 | |
| cpp options | 410 | |
| Appendix C | Assembler directives and options | 415 |
| as options | 415 | |
| as directives | 417 | |
| Debug information | 421 | |
| Appendix D | Linker options | 423 |
| Appendix E | Where to get sources | 431 |
| CD-ROM producers | 431 | |
| Appendix F | Bibliography | 435 |