127 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
PURPOSE of /tools/glibc/Regression/bz600457-locally-defined-symbol-resolving-failure
 | 
						|
Description: Test for bz600457 ([4.8] Unexpected failure of resolving a)
 | 
						|
Author: Petr Muller <pmuller@redhat.com>
 | 
						|
Bug summary: [4.8] Unexpected failure of resolving a locally-defined symbol.
 | 
						|
Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=600457
 | 
						|
 | 
						|
Description:
 | 
						|
 | 
						|
Customer Contact Name:
 | 
						|
Naoki Yanagimoto
 | 
						|
 | 
						|
Description of Problem:
 | 
						|
This problem is the same as issue #580553 of RHEL5.
 | 
						|
This ticket is for RHEL4.
 | 
						|
 | 
						|
We hit a failure of resolving a symbol which is locally defined in a library,
 | 
						|
in a complex case that I'll describe below.
 | 
						|
If the dynamic linker, glibc or something else has a bug in it, please fix it.
 | 
						|
If we did something wrong on creating a program, please point it out.
 | 
						|
 | 
						|
We wrote a program that consists of an executable file and four libraries.
 | 
						|
The executable file a.out requires two libraries, libA and libX.
 | 
						|
The library libA requires another library libB.
 | 
						|
The library libB requires another library libC.
 | 
						|
 | 
						|
The program operates in the following steps.
 | 
						|
 | 
						|
+------+      +-------+      +------+    +------+      +-----------------------------------+
 | 
						|
| libX |  (2) | a.out | (1)  | libA |----| libB |------| libC  (5)        (7)              |
 | 
						|
|      | <=== |  (8)  | ===> |      |    |      | <=== | atexit(libC_fini)--> _libC_fini() |
 | 
						|
+------+  (3) +-------+ (6)  +------+    +------+  (4) +-----------------------------------+
 | 
						|
 | 
						|
(1) a.out calls dlopen() for libA.
 | 
						|
    libB and libC shall be loaded, too.
 | 
						|
(2) a.out calls dlopen() for libX.
 | 
						|
(3) a.out calls dlclose() for libX.
 | 
						|
(4) libC calls dlopen() for libB.
 | 
						|
(5) libC calls atexit() to register libC_fini().
 | 
						|
(6) a.out calls dlclose() for libA.
 | 
						|
    libB and libC are no longer needed, so both libraries shall be getting unloaded.
 | 
						|
(7) libC_fini() shall be called when libC is getting unloaded.
 | 
						|
(8) a.out exits.
 | 
						|
 | 
						|
But when we run the program, unexpectedly
 | 
						|
 | 
						|
a) step (7) is executed _after_ step (8)
 | 
						|
b) libC cannot resolve a locally-defined symbol _libC_fini at executing (7)
 | 
						|
 | 
						|
Version-Release number of selected component:
 | 
						|
- Red Hat Enterprise Linux Version Number: 4
 | 
						|
- Release Number: 8
 | 
						|
- Architecture: x86
 | 
						|
- Kernel Version: 2.6.9-89.ELsmp
 | 
						|
- Related Package Version: glibc-2.3.4-2.43.el4_8.2
 | 
						|
- Related Middleware / Application: None
 | 
						|
 | 
						|
Drivers or hardware or architecture dependency:
 | 
						|
None.
 | 
						|
 | 
						|
How reproducible:
 | 
						|
always.
 | 
						|
 | 
						|
Step to Reproduce:
 | 
						|
1) Extract the reproducer.
 | 
						|
   $ tar zxvf reproducer.tar.gz
 | 
						|
 | 
						|
2) Compile it.
 | 
						|
   $ cd reproducer
 | 
						|
   $ make
 | 
						|
 | 
						|
3) Run it.
 | 
						|
   $ ./run.sh
 | 
						|
 | 
						|
Actual Results:
 | 
						|
$ ./run.sh
 | 
						|
1)main:dlopen  libA.so
 | 
						|
2)main:dlopen  libX.so
 | 
						|
3)main:dlclose libX.so
 | 
						|
4)libC:dlopen  libB.so
 | 
						|
5)libC:atexit(libC_fini)
 | 
						|
6)main:dlclose libA.so
 | 
						|
8)main:finish main
 | 
						|
./main: symbol lookup error: ./libC.so: undefined symbol: _libC_fini
 | 
						|
 | 
						|
Expected Results:
 | 
						|
$ ./run.sh
 | 
						|
1)main:dlopen  libA.so
 | 
						|
2)main:dlopen  libX.so
 | 
						|
3)main:dlclose libX.so
 | 
						|
4)libC:dlopen  libB.so
 | 
						|
5)libC:atexit(libC_fini)
 | 
						|
6)main:dlclose libA.so
 | 
						|
7)libC:finish - atexit()
 | 
						|
8)main:finish main
 | 
						|
 | 
						|
Summary of actions taken to resolve issue:
 | 
						|
None.
 | 
						|
 | 
						|
Location of diagnostic data:
 | 
						|
None.
 | 
						|
 | 
						|
Hardware configuration:
 | 
						|
Model: PRIMERGY RX300 S5
 | 
						|
CPU Info: Xeon(R) 2.27GHz x2
 | 
						|
Memory Info: 3GB
 | 
						|
Hardware Component Information: None
 | 
						|
Configuration Info: None
 | 
						|
Guest Configuration Info: None
 | 
						|
 | 
						|
Business Impact:
 | 
						|
The application suffering this issue cannot call the function registered
 | 
						|
by atexit() because of the failure of resolving its symbol. It causes two
 | 
						|
severe problems, a) the failure of cooperation with other processes by
 | 
						|
notifying them of its completion, and b) the system resource leaks by not
 | 
						|
freeing them.
 | 
						|
 | 
						|
Target Release: 4.9
 | 
						|
 | 
						|
Errata Request: async errata for 4.8
 | 
						|
 | 
						|
Hotfix Request: None.
 | 
						|
 | 
						|
Additional Info:
 | 
						|
Sosreport and reproducer are attached.
 | 
						|
 | 
						|
This is the same bug as IT #580553 https://bugzilla.redhat.com/show_bug.cgi?id=593675 (RHEL5)
 |