| 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 |