1) testGlobalAfterNested(frysk.rt.TestSymbol)junit.framework.ComparisonFailure: symbol global_outer expected:<global_outer> but was:<local_st_size_0> at frysk.rt.TestSymbol.symbolTest(TestRunner) at frysk.rt.TestSymbol.testGlobalAfterNested(TestRunner) at frysk.junit.Runner.runCases(TestRunner) at frysk.junit.Runner.runArchCases(TestRunner) at frysk.junit.Runner.runTestCases(TestRunner) at TestRunner.main(TestRunner) 2) testLocalAfterNested(frysk.rt.TestSymbol)junit.framework.ComparisonFailure: symbol local_outer expected:<...outer> but was:<...st_size_0> at frysk.rt.TestSymbol.symbolTest(TestRunner) at frysk.rt.TestSymbol.testLocalAfterNested(TestRunner) at frysk.junit.Runner.runCases(TestRunner) at frysk.junit.Runner.runArchCases(TestRunner) at frysk.junit.Runner.runTestCases(TestRunner) at TestRunner.main(TestRunner) These two are effectively the same. The layout is: local_st_size_0: // this symbol has no size global_outer: nop local_in_global: nop .size local_in_global, .-local_in_global nop <<you-are-here>> .size global_outer, .-global_outer that is global_outer contains a nested symbol but the "pc" is beyond that back in the outer/global symbol. I'm guessing that "global_outer" should be returned. Currently local_st_size_0 is returned :-( 3) testNoSymbolAfterGlobal(frysk.rt.TestSymbol)junit.framework.ComparisonFailure: symbol [unknown] expected:<[unknown]> but was:<local_st_size_0> at frysk.rt.TestSymbol.symbolTest(TestRunner) at frysk.rt.TestSymbol.testNoSymbolAfterGlobal(TestRunner) at frysk.junit.Runner.runCases(TestRunner) at frysk.junit.Runner.runArchCases(TestRunner) at frysk.junit.Runner.runTestCases(TestRunner) at TestRunner.main(TestRunner) 4) testNoSymbolAfterLocal(frysk.rt.TestSymbol)junit.framework.ComparisonFailure: symbol [unknown] expected:<[unknown]> but was:<local_st_size_0> at frysk.rt.TestSymbol.symbolTest(TestRunner) at frysk.rt.TestSymbol.testNoSymbolAfterLocal(TestRunner) at frysk.junit.Runner.runCases(TestRunner) at frysk.junit.Runner.runArchCases(TestRunner) at frysk.junit.Runner.runTestCases(TestRunner) at TestRunner.main(TestRunner) This is the no-symbol case, there is a hole in the memory where there is no valid symbol vis: local_st_size_0: // this symbol has no size global_symbol: nop nop .size global_symbol, .-global_symbol << you are here >> I'm guessing it should not get a symbol at all (the [unknown]). It currently gets the nearest unsized symbol. 5) testGlobalSize0InGlobal(frysk.rt.TestSymbol)junit.framework.ComparisonFailure: symbol global_0_in_global expected:<...0_in_global> but was:<...after_0> at frysk.rt.TestSymbol.symbolTest(TestRunner) at frysk.rt.TestSymbol.testGlobalSize0InGlobal(TestRunner) at frysk.junit.Runner.runCases(TestRunner) at frysk.junit.Runner.runArchCases(TestRunner) at frysk.junit.Runner.runTestCases(TestRunner) at TestRunner.main(TestRunner) 6) testLocalSize0InGlobal(frysk.rt.TestSymbol)junit.framework.ComparisonFailure: symbol local_0_in_global expected:<local_0_in_global> but was:<global_after_0> at frysk.rt.TestSymbol.symbolTest(TestRunner) at frysk.rt.TestSymbol.testLocalSize0InGlobal(TestRunner) at frysk.junit.Runner.runCases(TestRunner) at frysk.junit.Runner.runArchCases(TestRunner) at frysk.junit.Runner.runTestCases(TestRunner) at TestRunner.main(TestRunner) 7) testGlobalSize0InLocal(frysk.rt.TestSymbol)junit.framework.ComparisonFailure: symbol global_0_in_local expected:<global_0_in_local> but was:<local_after_0> at frysk.rt.TestSymbol.symbolTest(TestRunner) at frysk.rt.TestSymbol.testGlobalSize0InLocal(TestRunner) at frysk.junit.Runner.runCases(TestRunner) at frysk.junit.Runner.runArchCases(TestRunner) at frysk.junit.Runner.runTestCases(TestRunner) at TestRunner.main(TestRunner) 8) testLocalSize0InLocal(frysk.rt.TestSymbol)junit.framework.ComparisonFailure: symbol local_0_in_local expected:<...0_in_local> but was:<...after_0> at frysk.rt.TestSymbol.symbolTest(TestRunner) at frysk.rt.TestSymbol.testLocalSize0InLocal(TestRunner) at frysk.junit.Runner.runCases(TestRunner) at frysk.junit.Runner.runArchCases(TestRunner) at frysk.junit.Runner.runTestCases(TestRunner) at TestRunner.main(TestRunner) These are cases where there is a nested symbol within a sized symbol vis: global_after_0: nop local_0_in_global: << you are here >> nop .size global_after_0, .-global_after_0 here, since the PC is exactly at the unsized local symbol I'm guessing that it should return that. It currently gets the containing sized symbol.
Created attachment 160041 [details] Candidate fix Ignore the printf's :-)
This gives a better fuzzy match. Notice how it looks at the symbol's end, not start. If this matches a sized symbol it is later discarded. /* Save the symbol which is "closer". Use the end-address so that a sized symbol that ends closer to an unsized symbol wins (unsized symbols are typically created using hand-written assembler). */ if (sym.st_value + sym.st_size >= closest_sym->st_value + closest_sym->st_size && same_section (&sym, shndx)) { closest (); continue; } }
elfutils-0.129-1.fc7 has been pushed to the Fedora 7 testing repository. If problems still persist, please make note of it in this bug report.
elfutils-0.129-1.fc7 has been pushed to the Fedora 7 stable repository. If problems still persist, please make note of it in this bug report.