2013-04-10 42 views
5

Bạn có thể giúp tôi hiểu thế nàoC chương trình: __start

__start 

được sử dụng trong C trong nội bộ?

Đây có phải là bản sao chính xác của hàm main hoặc đó có phải là điểm vào của chương trình đã biên dịch không?

Chỉ cần tự hỏi, làm thế nào nó được sử dụng?

+2

Bạn có thể cho chúng tôi một số ngữ cảnh không? Bạn thấy '__start' ở đâu? – NPE

+1

Nó ** là ** điểm vào. –

Trả lời

11

Here là tổng quan tốt về những gì xảy ra trong khi khởi động chương trình trướcmain. Cụ thể, nó cho thấy rằng __startđiểm vào thực tế cho chương trình của bạn từ điểm quan sát OS.

Đây là địa chỉ đầu tiên mà từ đó số instruction pointer sẽ bắt đầu tính trong chương trình của bạn.

Mã có gọi một số thói quen thư viện thời gian chạy C chỉ để thực hiện một số dịch vụ vệ sinh, sau đó gọi số main và sau đó mang mọi thứ xuống và gọi exit với mã exit bất kỳ main.


Một bức tranh trị giá một ngàn chữ:

C runtime startup diagram

+0

+1 để liên kết tốt đẹp. :) – lang2

+0

Liên kết tuyệt vời !!! 1, là nó có thể trích dẫn những điều chính trong đó, trong trường hợp trang web sẽ được xuống một số ngày, hy vọng là không. – 0x90

+0

Trong trường hợp bài viết chết một số ngày trong tương lai - có lẽ Máy Wayback [có thể giúp] (https://web.archive.org/web/20170822123701/http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup. html). – ulidtko

0

_start là một chức năng của hệ điều hành .... đó là điểm mấu chốt cho bất kỳ chương trình ... như trình biên dịch của chúng tôi biết về chính (chính không phải là định nghĩa trước chức năng nó được người dùng định nghĩa nhưng tất cả các trình biên dịch biết về họ) chức năng _start này sẽ gọi chính và từ điểm đó chương trình của chúng tôi nhập vào CPU

+1

Tôi đoán, bạn phải mô tả !! Cảm ơn bạn đã dùng thử. – San

0

Theo tiêu chuẩn C/C++, main() là điểm bắt đầu của một chương trình. Nếu bạn đang sử dụng GCC, chức năng _start là điểm vào của chương trình C thực hiện cuộc gọi đến main(). Công việc chính của hàm _start() là thực hiện một số tác vụ khởi tạo.

// $ gcc program_entry.c -nostartfiles 
// $ ./a.out 
// custom program entry 

#include <stdio.h> 
#include <stdlib.h> 

void program_entry(void); 


void 
_start(void) 
{ 
    program_entry(); 
} 

void 
program_entry(void) 
{ 
    printf("custom program entry\n"); 
    exit(0); 
} 

Nếu bạn muốn, mục nhập chương trình cũng có thể được biên dịch bằng chuyển đổi -e trong GCC.

// $ gcc program_entry.c -e __start 
// $ ./a.out 
// custom program entr 

#include <stdio.h> 

void program_entry(void); 


void 
_start(void) 
{ 
    program_entry(); 
} 


void 
program_entry(void) 
{ 
    printf("custom program entry\n"); 
} 
Các vấn đề liên quan