builtin_return_address와 -fomit-frame-pointer

novicero의 이미지

foo(void)
{
    printf("Stack trace:\n");
    printf("0: %p\n", __builtin_return_address(0));
    printf("1: %p\n", __builtin_return_address(1));
    printf("2: %p\n", __builtin_return_address(2));
    printf("3: %p\n", __builtin_return_address(3));
    printf("4: %p\n", __builtin_return_address(4));
    printf("5: %p\n", __builtin_return_address(5));
    printf("6: %p\n", __builtin_return_address(6));
    printf("7: %p\n", __builtin_return_address(7));
}
bar(void){
    int b;
    foo();
}
int
main(void)
{
    int a;
    bar();

    return 0;
}

gcc로 이 파일을 컴파일을 하였습니다.

gcc test.c

실행결과
Stack trace:
0: 0x804842a
1: 0x8048441
2: 0x42015574
3: 0x8048299
Segmentation fault

gcc -fomit-frame-pointer test.c

실행결과
Stack trace:
0: 0x8048427
1: 0x42015574
2: 0x8048299
Segmentation fault

질문은 3가지입니다.

1번.
0x42015574
이 주소는 뭐죠??
nm이나 objdump로 봐도 이런 주소는 없군요.

2번.
-fomit-frame-pointer를 쓰며는
"'-fomit-frame-pointer' 옵션을 쓰면 frame pointer가 필요없는 함수들을 컴파일할 때, frame pointer를 생략합니다."라고 설명이되어 있는데 frame pointer가 필요없는 함수라는게 어떤 것인지?

3번.
-fomit-frame-pointer로 결과가 달라졌는데 이유가 무엇인지?