楼主: 
descent (“雄辩是银,沉默是金”)   
2021-02-06 21:40:45│0x4000f7 <main+15>      lea
-0x4(%rbp),%rax                             │
   │0x4000fb <main+19>      mov
$0x6001b8,%esi                              │
   │0x400100 <main+24>      mov
%rax,%rdi                                   │
   │0x400103 <main+27>      callq  0x40010f
<swap>                             │
   │0x400108 <main+32>      mov
$0x0,%eax                                   │
   │0x40010d <main+37>
leaveq                                             │
  >│0x40010e <main+38>      retq
我使用 gdb 追踪这个程式, 你的程式在 retq 这一行发生错误,
应该是因为 c runtime library 没有被正确设定, 导致回不去上一层,
所以无法正确回到 shell。
int main()
{
  int a = 100;^M
  swap(&a, &shared);^M
  asm
  (
    "mov   $1, %eax\n"
    "int   $0x80\n"
  );
  return 0;
}
加入上述的 exit system call 就没有问题了。
不过由于没有使用 c runtime, 你得评估可能会发生什么问题。
是哪本书告知你这个技巧呢? 感觉没有补充说明该有的概念。
补充一下:
上述只是其中一种错误, 可能还会有另外的错误造成 Segmentation fault,
请不要以为这样改就会是正确的程式码。
※ 引述《gn00618777 (非常念旧)》之铭言:
: 我在阅读一本书,里面给一个静态连结的范例
: a.c:
:     extern int shared;
:     int main() {
:           int a = 100;
:           swap(&a, &shared);
:           return 0;
:     }
: b.c:
:     int shared = 1;
:     void swap(int *a, int *b){
:            *a ^= *b ^= *a ^= *b;
:     }
: 编译指令:
:           gcc -c a.c -fno-stack-protector
:           gcc -c b.c -fno-stack-protector
: 连结指令:
:           ld a.o b.o -e main -o ab
: 执行时:
:          ./ab 出现 segmentation fault(core dump)
: 请问有人知道这什么状况吗?  谢谢
: 我GCC 版本 gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
:   ld 版本 GNU ld (GNU Binutils for Ubuntu) 2.34