----- Original Message ----- > As a heads-up to those of you who are working with kernels > that were compiled with the new gcc-4.6.0. > > I had thought that gcc-4.6.0 was painful only as far as compiling > the crash utility was concerned, where there were a bunch of new > "error: variable <variable> set but not used [-Werror=unused-but-set-variable] > messages that I fixed in crash-5.1.2 and -5.1.3. And you may be aware that > that those for-the-most-part useless warnings recently caused an LKML shitstorm > w/respect to building kernels. > > But it's worse than that -- there is a problem with crash's embedded gdb > determining the member offsets of the (large) pglist_data structure if > the kernel was compiled with gcc-4.6.0. This is not specific to the > gdb-7.0 version that is built into crash, but with all gdb > versions as far as I can tell, certainly with gdb-7.2-48.el6 > and gdb-7.2.50.20110328-31.fc15. > > The problem is most clearly seen with "struct -o pglist_data", which > dumps the structure, showing the offset of each member. > > For comparison, here is the output from a (good) 2.6.38-rc4 kernel > that was compiled with gcc-4.5.1: > > crash> help -k | grep gcc_version > gcc_version: 4.5.1 > crash> struct -o pglist_data > struct pglist_data { > [0x0] struct zone node_zones[4]; > [0x1c00] struct zonelist node_zonelists[2]; > [0x13e40] int nr_zones; > [0x13e44] spinlock_t node_size_lock; > [0x13e48] long unsigned int node_start_pfn; > [0x13e50] long unsigned int node_present_pages; > [0x13e58] long unsigned int node_spanned_pages; > [0x13e60] int node_id; > [0x13e68] wait_queue_head_t kswapd_wait; > [0x13e80] struct task_struct *kswapd; > [0x13e88] int kswapd_max_order; > [0x13e8c] enum zone_type classzone_idx; > } > SIZE: 0x13f00 > crash> > > While here is the output from a 2.6.38.2-9.fc15 kernel that > was compiled with gcc-4.6.0: > > crash> help -k | grep gcc_version > gcc_version: 4.6.0 > crash> struct -o pglist_data > struct pglist_data { > [0x0] struct zone node_zones[4]; > [0x1c00] struct zonelist node_zonelists[2]; > [0x0] int nr_zones; > [0x0] spinlock_t node_size_lock; > [0x0] long unsigned int node_start_pfn; > [0x0] long unsigned int node_present_pages; > [0x0] long unsigned int node_spanned_pages; > [0x0] int node_id; > [0x0] wait_queue_head_t kswapd_wait; > [0x0] struct task_struct *kswapd; > [0x0] int kswapd_max_order; > [0x0] enum zone_type classzone_idx; > } > SIZE: 0x13f00 > crash> ... [ snip ] ... > > I filed a bugzilla with gdb, although it may likely be a bug with > the debuginfo data created by gcc-4.6.0. We'll see what happens... As it turns out, it's due to new gcc-4.6.0 behavior that gdb has never seen before. This is Tom Tromey's explanation: ------------------------------------------------------------------------ The DWARF is definitely correct, but (IMO) odd, e.g.: [ 4428] member name (strp) "nr_zones" decl_file (data1) 47 decl_line (data2) 615 type (ref4) [ ed] data_member_location (data4) location list [ 13e40] The earlier version doesn't have a location list here, just a constant: [ 447e] member name (strp) "nr_zones" decl_file (data1) 47 decl_line (data2) 615 type (ref4) [ c7] data_member_location (sdata) 13e40 The bug is that gdb gives up on this kind of member location. ------------------------------------------------------------------------- I'm testing a patch from Tom, which thankfully prevents having to insert a kludge workaround. Dave -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility